2015-07-27 12 views
7

To może być łatwe pytanie, ale nie mogę uzyskać wyniku, który chcę!znaleźć wszystkie cyfry między znak w python

Mam tekst jak ten poniżej:

text = 'To get to the destination follow this direction 
1. First turn left and then 
text text text 
2. Secondly you have to some text here 
some text here 

For the second instruction follow the text below: 
«1. some text some text some text 
text text text. 
2. some text some text text text text. 
3. some text some text text text text.»' 

używam regex w python i chcę uzyskać wszystkie numery między tymi postaciami „«”„»”, który jest 1. 2. i 3.

próbowałem coś takiego:

test = re.findall(r'[«.*?](\d+)[.*?»]', text, re.DOTALL) 

lub to:

patt = re.findall(r'«.*?(\d+).*?»', text, re.DOTALL) 

i wiele innych, ale żaden z nich nie zwraca tego, czego chcę. Co ja robię źle?

Oba wzory zwracają tylko cyfrę 1 bez żadnej innej cyfry. A co z liczbą 2 i 3?

+1

Myślę, że musisz użyć wcześniejszego widoku i lookbehind, w przeciwnym razie '<' and '>' są tylko dopasowane raz, więc dostajesz tylko jedną liczbę. –

+0

Jeśli używam uprzedzenia lub lookbehind, nie muszę konkretnie określać, ile znaków ma wyglądać za lub z wyprzedzeniem dla << and >> @tobias_k? – bettas

+0

@Bettas dla lookbehind, tak jest w przypadku, tak, dla uprzedzenia - nie. Pracuję nad połączeniem wyprzedzania i przechwytywania grup, aby znaleźć dla ciebie rozwiązanie. Uzyskanie wielu wyników za pomocą pojedynczego ograniczenia nie jest łatwe w przypadku wyrażenia regularnego, łatwiej byłoby zrobić je z wieloma dopasowaniami po kolei. –

Odpowiedz

4
text = '''To get to the destination follow this direction 
1. First turn left and then 
text text text 
2. Secondly you have to some text here 
some text here 

For the second instruction follow the text below: 
«1. some text some text some text 
text text text. 
2. some text some text text text text. 
3. some text some text text text text.»''' 


print re.findall(ur"\d+",re.findall(ur"«([\s\S]*?)»",text)[0]) 

lub

print re.findall(ur"\d+","\n".join(re.findall(ur"«([\s\S]*?)»",text))) 

Należy to zrobić to za Ciebie.

+0

tak! To działa @vks! Ale nadal jestem zaniepokojony, dlaczego używać regex dla takich problemów! W każdym razie użyję tego wzoru! Wielkie dzięki! – bettas

+0

@bettas z regex u masz krótszy schludniejszy kod ..... – vks

Powiązane problemy