2013-04-18 7 views
5

Oto wejście:Jak skonstruować regex dla tego tekstu

7. Data 1 1. STR1 STR2 3. 12345 4. 0876 9. NO 2 1. STR 2. STRT STR 3. 9909090 5. YES 6. NO 7. YES 8. NO 9. YES 10. 5000 XX 11. 1000 ZŁ 12. NO PRub. 1 1. 1000 XX 2. NO 3 1. STRT 2. STRT 3. 63110300291 5. YES 6. NO 7. NO 8. NO 9. YES 10. 5000 XX 11. 1000 ZŁ 12. NO PRub. 1 1. 1000 XX 2. NO 4 1. QWERET 2. IOSTR9 3. 76012509879 5. YES 6. NO 7. NO 8. NO 9. YES 10. 5000 XX 11. 1000 XX 12. NO PRub. 1 1. 1000 XX 2. NO 0 1. 

a tu oczekiwany wynik:

[('1', '1. STR1 STR2 3. 12345 4. 0876 9. NO'), 
('2', '1. STR 2. STRT STR 3. 9909090 5. YES 6. NO 7. YES 8. NO 9. YES 10. 5000 XX 11. 1000 ZŁ 12. NO PRub. 1 1. 1000 XX 2. NO'), 
('3', '1. STRT 2. STRT 3. 63110300291 5. YES 6. NO 7. NO 8. NO 9. YES 10. 5000 XX 11. 1000 ZŁ 12. NO PRub. 1 1. 1000 XX 2. NO'), 
('4', '1. QWERET 2. IOSTR9 3. 76012509879 5. YES 6. NO 7. NO 8. NO 9. YES 10. 5000 XX 11. 1000 XX 12. NO PRub. 1 1. 1000 XX 2. NO')] 

Próbowałem to:

re.findall(r'(?=\s(\d+)\s(1\..*?)\s\d+\s1\.)', txt, re.DOTALL) 

Ale oczywiście to niepoprawne rozwiązanie - regex musi pasować do (\d+) 1., ale nie do PRub. 1 1..
Co powinienem zrobić, aby działało?

+0

@sudo_O nie mogę odczytać ciąg wejściowy jest zbyt długi! Odzyskaj to! – gaussblurinc

+0

Formatowanie @loldop jest ważne, pytania powinny być sformatowane tak, aby było jasne, czy dane wejściowe to linia pojedyncza czy wieloliniowa. Użyj pionowego paska przewijania, aby odczytać ciąg znaków. –

+0

@sudo_O Wiem, ale możesz sobie wyobrazić, że jest to jedna linia z '\ n'. Wolę używać wyobraźni, nie przewijać w sytuacji dużego ciągu znaków. – gaussblurinc

Odpowiedz

4

Jak to:

In [1]: s='7. Data 1 1. STR1 STR2 3. 12345 4. 0876 9. NO 2 1. STR 2. STRT STR 3. 9909090 5. YES 6. NO 7. YES 8. NO 9. YES 10. 5000 XX 11. 1000 ZŁ 12. NO PRub. 1 1. 1000 XX 2. NO 3 1. STRT 2. STRT 3. 63110300291 5. YES 6. NO 7. NO 8. NO 9. YES 10. 5000 XX 11. 1000 ZŁ 12. NO PRub. 1 1. 1000 XX 2. NO 4 1. QWERET 2. IOSTR9 3. 76012509879 5. YES 6. NO 7. NO 8. NO 9. YES 10. 5000 XX 11. 1000 XX 12. NO PRub. 1 1. 1000 XX 2. NO 0 1.' 

In [2]: import re 

In [3]: re.findall('(?<=\s)\d.*?(?=\s\d\s\d[.](?=$|\s[A-Z]))',s) 
Out[3]: 
['1 1. STR1 STR2 3. 12345 4. 0876 9. NO', 
'2 1. STR 2. STRT STR 3. 9909090 5. YES 6. NO 7. YES 8. NO 9. YES 10. 5000 XX 11. 1000 Z\xc5\x81 12. NO PRub. 1 1. 1000 XX 2. NO', 
'3 1. STRT 2. STRT 3. 63110300291 5. YES 6. NO 7. NO 8. NO 9. YES 10. 5000 XX 11. 1000 Z\xc5\x81 12. NO PRub. 1 1. 1000 XX 2. NO', 
'4 1. QWERET 2. IOSTR9 3. 76012509879 5. YES 6. NO 7. NO 8. NO 9. YES 10. 5000 XX 11. 1000 XX 12. NO PRub. 1 1. 1000 XX 2. NO'] 

Dla ciebie dokładny wyjście zrobiłbym coś takiego:

In [4]: ns = re.findall('(?<=\s)\d.*?(?=\s\d\s\d[.](?=$|\s[A-Z]))',s) 

In [5]: [tuple(f.split(' ',1)) for f in ns] 
Out[5]: 
[('1', '1. STR1 STR2 3. 12345 4. 0876 9. NO'), 
('2', '1. STR 2. STRT STR 3. 9909090 5. YES 6. NO 7. YES 8. NO 9. YES 10. 5000 XX 11. 1000 Z\xc5\x81 12. NO PRub. 1 1. 1000 XX 2. NO'), 
('3', '1. STRT 2. STRT 3. 63110300291 5. YES 6. NO 7. NO 8. NO 9. YES 10. 5000 XX 11. 1000 Z\xc5\x81 12. NO PRub. 1 1. 1000 XX 2. NO'), 
('4', '1. QWERET 2. IOSTR9 3. 76012509879 5. YES 6. NO 7. NO 8. NO 9. YES 10. 5000 XX 11. 1000 XX 12. NO PRub. 1 1. 1000 XX 2. NO')] 

może być lepszym sposobem, aby to zrobić, ale mój pyton foo nie jest tak dobra jako mój regexp foo.

Regexplanation:

(?<=\s) # Use positive look-behind to match a leading space but don't include it 
\d  # match digit  
.*?  # Match everything up till the next record (lazy) 
     # The following positive look-behinds is the key. It matches the start of 
     # each new record i.e 
     # 2 1. S 
     # 3 1. S 
     # 4 1. Q 
     # 0 1.$ 
     # look-arounds match but don't seek past. 
(?=\s\d\s\d[.](?=$|\s[A-Z])) 
(?=  # positive look-ahead 1 
\s  # space 
\d  # digit 
\s  # space 
\d  # digit 
[.]  # period 
(?=  # postive look-ahead 2 
$  # end of string 
|  # OR 
\s[A-Z] # space followed by uppercase letter 
)  # close look-ahead 1 
)  # close look-ahead 2 
+0

"NIE" może być cokolwiek innego w innym przypadku, powinniśmy tylko spojrzeć na słowo "PRUB" – Kiro

+0

@Kiro, myślę, że to zrobiłem, przetestuj nowe wyrażenie. –

+1

Dzięki! Działa świetnie dla wszystkich moich przypadków! – Kiro

Powiązane problemy