2011-11-16 18 views
7

Próbuję zrzucić dane z pliku eksportu SQL za pomocą wyrażenia regularnego. Aby dopasować pole treści wiadomości, używam "(?P<content>.*?)". To działa dobrze przez większość czasu, ale jeśli pole zawiera ciąg "\ n", wyrażenie regularne nie będzie pasować. Jak zmodyfikować wyrażenie regularne, aby je dopasować? Dzięki!Wyrażenie regularne: jak dopasować ciąg zawierający " n" (znak nowej linii)?

Przykład (ja Pythonie)

>>> re.findall("'(?P<content>.*?)'","'<p>something, something else</p>'") 
['<p>something, something else</p>'] 

>>> re.findall("'(?P<content>.*?)'","'<p>something, \n something else</p>'") 
[] 

P.S. Pozornie wszystkie ciągi z "\" z przodu są traktowane jako znaki ucieczki. Jak mogę powiedzieć regxowi, aby traktował je takimi, jakie są?

Odpowiedz

21

Należy użyć DOTALL opcję:

>>> re.findall("'(?P<content>.*?)'","'<p>something, \n something else</p>'", re.DOTALL) 
['<p>something, \n something else</p>'] 

Zobacz this.

+0

Dzięki! Ponadto, na przykład, jeśli w tekście napisałem "\ a", zostanie on przekonwertowany na "\ x07". Czy istnieje sposób, aby zatrzymać je takimi, jakie są? A może to nie ma znaczenia, kiedy umieściłem je w bazie danych? –

+1

'\ x07' jest po prostu sposobem dla Pythona do reprezentowania znaku z kodem 7. Innym sposobem na jego reprezentację jest napisanie' \ a'. Łańcuch w rzeczywistości zawiera tylko jeden znak w obu przypadkach. Możesz to potwierdzić, zaznaczając 'len (" \ x07 ")' i 'len (" \ a ")'. Spróbuj także porównać '" \ a "==" \ x07 "' lub wyszukać '" a "' in' "\ a" ':" "\ a" .find ("a") 'lub dla' "0" 'w' "\ x07" ':' "\ x07" .find ("0") '. Wyniki powinny być bardzo pouczające. –

+0

Cześć Adam! Nadal stwarza problem, jeśli łańcuch początkowy zawiera \ 'Wynik zostanie przekonwertowany na', co spowoduje przerwanie poleceń sql. Dlatego ważne jest, aby napis "tak jak jest" –

3

Potrzebujesz modyfikatora Dotall, aby kropka odpowiadała również znakom nowej linii.

re.S
re.DOTALL
Wykorzystaj '' znak specjalny pasuje do dowolnej postaci pod numerem wszystkie, w tym znak nowej linii; bez tej flagi "." będzie pasować do wszystkiego, co , z wyjątkiem znaku nowej linii.

zobaczyć to here on docs.python.org

Powiązane problemy