Chciałbym połączyć zmienną i wzór pytona. Jak mogę to zrobić?Python regex: łączenie formatu ponownego wzoru ze zmienną
poniżej jest to, co chciałbym zrobić.
re.search(r'**some_variable+pattern**',str_for_pattern_match,flags)
Dzięki za pomoc.
Chciałbym połączyć zmienną i wzór pytona. Jak mogę to zrobić?Python regex: łączenie formatu ponownego wzoru ze zmienną
poniżej jest to, co chciałbym zrobić.
re.search(r'**some_variable+pattern**',str_for_pattern_match,flags)
Dzięki za pomoc.
re.search(r'**{0}+pattern**'.format(variable_name), str_for_pattern_match, flags)
teraz wszystkie swoje {…}
będą interpretowane jako string format zastępcze.
Trzeba jednak pamiętać, że: jeśli zmienna ma specjalne metaznaki, zostaną one wzięte jako ... Jeśli jest to niepożądane, można chcieć otaczać symbol zastępczy '\ Q' i' \ E': 'r ' \ Q {0} \ E ' – fge
Zazwyczaj ciąg formatowania sposób działa dobrze
re.search(r'**%s+pattern**' % some_variable, str_for_pattern_match, flags)
regularne wzory ekspresji nie jakiś specjalny dodatkowy rzeczą, że Python traktuje specjalnie. Wzorzec to po prostu idealnie zwykła wartość ciągu, którą moduł re
interpretuje jako wzorzec.
Pytanie nie brzmi "w jaki sposób mogę użyć zmiennej we wzorcu?", Ale raczej "w jaki sposób mogę skonstruować ciąg na podstawie zmiennej?".
Dokumentacja w języku Python zawiera mnóstwo informacji o tym, jak to zrobić. Szczególnie przydatna będzie dokumentacja pod numerem string methods. Najważniejszym z nich w celu skonstruowania wyrażeń regularnych prawdopodobnie będzie prawdopodobnie str.format
(jak pokazano w odpowiedzi eumiro), która ma a large section of its own opisujące, w jaki sposób sformatować podstawowe typy danych w ciągi szablonów w niemal dowolny sposób.
Jeśli możesz opanować podstawowe operacje na ciągach, to przyklejenie zmiennej do wyrażenia regularnego będzie najmniejszym z tego, co możesz zrobić!
Należy zachować ostrożność podczas wstawiania ciągów do wzorca regexp.
Dzieje się tak, ponieważ ciąg może zawierać special regexp characters, co może prowadzić do błędów lub dać nieoczekiwane wyniki.
Aby dać przykład:
>>> import re
>>> s = 'one*two*three*four*five'
>>> t = '*f'
>>> r = re.compile(r'%s\w+' % t)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/re.py", line 190, in compile
return _compile(pattern, flags)
File "/usr/lib/python2.7/re.py", line 244, in _compile
raise error, v # invalid expression
sre_constants.error: nothing to repeat
To nie działa, ponieważ wstawiony ciąg zawiera *
, który jest znakiem specjalnym regexp.
Jednak problem ten można rozwiązać za pomocą funkcji re.escape
na włożonej wyrażenie:
>>> r = re.compile(r'%s\w+' % re.escape(t))
>>> r.findall(s)
['*four', '*five']
W rzeczywistości mam wątpliwości, że wyrażenie regularne począwszy od dwóch gwiazd, a kończąc dwóch gwiazd jest ważny jeden –
W uwagach do odpowiedzi, które chcesz dodać, musisz zwrócić szczególną uwagę na wartość zmiennej, ponieważ może to być traktowane jako wyrażenie regularne, co daje zły wynik po zastosowaniu tego wyrażenia regularnego. – demalexx
[** To pytanie **] (http://stackoverflow.com/questions/6930982/variable-inside-python-regex) jest podobne do twojego. To może ci pomóc. –