2016-07-01 4 views
2

Я знаю p=re.compile('aaa|bbb') может работать, но я хочу переписать p = re.compile('aaa|bbb') с помощью переменных, что-то вродерегулярное выражение питона о или

A = 'aaa' 
B = 'bbb' 
p = re.compile(A|B) 

, но это не работает. Как я могу переписать это, чтобы использовать переменные (и это работает)?

ответ

4

p=re.compile(A|B)

Вы не делаете конкатенации правильно. То, что вы делаете, применяя "bitwise or" (the pipe) operator к строкам, которые, конечно, терпит неудачу:

>>> 'aaa' | 'bbb' 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unsupported operand type(s) for |: 'str' and 'str' 

Вместо этого, вы можете использовать str.join():

p = re.compile(r"|".join([A, B])) 

Демо:

>>> A = 'aaa' 
>>> B = 'bbb' 
>>> r"|".join([A, B]) 
'aaa|bbb' 

И, убедитесь, что вы доверяете источнику A и B (остерегайтесь Regex injection attacks) или/или правильно escape.

+0

Python уже предоставляет функцию для их удаления, а именно ['re.escape'] (https://docs.python.org/3/library/re.html#re.escape). Поэтому, чтобы сделать чередование произвольного набора литералов, вы просто выполните: 'r '|' .join (map (re.escape, literals_to_alternate_on))'. – ShadowRanger

Смежные вопросы