Zanurkuj w Pythonie/Rozwlekłe wyrażenia regularne: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
mNie podano opisu zmian |
→Verbose Regular Expressions: tłumaczenie |
||
Linia 1:
{{Podświetl|py}}
==
Jak narazie mieliśmy do czynienia z czymś co nazywam "kompaktowymi" wyrażeniami regularnymi. Jak widziałeś, śa one trudne do odczytania i nawet jeśli już je rozszyfrujesz, nie ma gwarancji że zrobisz to za np. sześć miesięcy. To czego potrzebujemy to dokumentacja w ich treści.
Python pozwala na to przez tworzenie tzw. rozwlekłych wyrażeń regularnych. Różnią się one od kompaktowych dwoma rzeczami:
* Białe znaki są ignorowane. Spacje, znaki tabulacji, znaki nowej linii nie są dopasowywane jako spacje, znaki tabulacji ani znaki nowej linii. Nie są wcale dopasowywane. (Jeśli byś chciał jednak dopasować któryś z nich musisz poprzedzić je backslashem.)
* Komentarze są ignorowane. Komentarz w rozwlekłym wyrażeniu regularnym wygląda dokładnie tak samo jak w kodzie Pythona: zaczyna się od # i leci aż do końca linii. W tym przypadku jest to komentarz w wieloliniowym łańcuchu znaków, ale zasada działania jest taka sama.
Łatwiej będzie to zrozumieć jeśli skorzystamy z przykładu. Weźmy kompaktowe wyrażenie regularne jakie tworzyliśmy wcześniej i zmieńmy je w rozwlekłe. Ten przykład pokazuje jak.
'''
>>> pattern = """
^ #
M{0,4} #
(CM|CD|D?C{0,3}) #
#
(XC|XL|L?X{0,3}) #
# or 50-80 (L,
(IX|IV|V?I{0,3}) #
#
$ #
"""
>>> re.search(pattern, 'M', re.VERBOSE) #(1)
Linia 31:
>>> re.search(pattern, 'M') #(4)
# Najważniejszą rzeczą o której należy pamiętać przy korzystaniu z rozwlekłych wyrażeń regularnych jest to, że musisz przekazać dodatkowy argument: re.VERBOSE. Jest to stała zdefiniowana w module re która sygnalizuje, że wyrażenie powinno być traktowane jako rozwlekłe. Jak widzisz, ten wzorzec ma mnóstwo białych znaków (które są ignorowane) i kilka komentarzy (które też są ignorowane). Gdy zignorujesz i białe znaki i komentarze, to pozostanie dokładnie to samo wyrażenie regularne jakie otrzymaliśmy w poprzednim przykładzie, ale o wiele bardziej czytelne.
# To dopasowuje początek łańcucha, potem jedno z czterech możliwych M, potem CM, L i trzy z trzech możliwych X, potem IX i koniec łańcucha.
# To dopasowuje początek łańcucha, potem cztery z czterech możliwych M, dalej D, trzy z trzech możliwych C, L z trzema możliwymi X, potem V z trzema możliwymi I i na koniec koniec łańcucha.
# Tutaj nie udało się dopasować niczego. Czemu? Ponieważ nie przekazaliśmy flagi re.VERBOSE, więc funkcja re.search traktuje to wyrażenie regularne jako kompaktowe, z dużą ilością białych znaków i hash'ów. Python nie rozpoznaje samodzielnie czy każemy mu dopasować kompaktowe czy rozwlekłe wyrażenie regularne i przyjmuje, że każde jest kompaktowe, chyba że wyraźnie wskażemy że tak nie jest.
<noinclude>
|