2011-12-29 11 views
6

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.

+0

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 –

+0

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

+0

[** To pytanie **] (http://stackoverflow.com/questions/6930982/variable-inside-python-regex) jest podobne do twojego. To może ci pomóc. –

Odpowiedz

4
re.search(r'**{0}+pattern**'.format(variable_name), str_for_pattern_match, flags) 

teraz wszystkie swoje {…} będą interpretowane jako string format zastępcze.

+3

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

14

Zazwyczaj ciąg formatowania sposób działa dobrze

re.search(r'**%s+pattern**' % some_variable, str_for_pattern_match, flags) 
5

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ć!

3

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']