сопоставление нескольких регулярных выражений с использованием соединения - PullRequest
0 голосов
/ 14 января 2019

У меня есть словарь, ключи которого - все предварительно скомпилированные регулярные выражения. Я хочу сопоставить строку с любым из этих регулярных выражений.

При исследовании я обнаружил, что вы можете сопоставлять несколько регулярных выражений, объединяя их с помощью метода join. Но когда я это делаю, я получаю сообщение об ошибке типа:

import re

regex1 = re.compile("regex1.*")
regex2 = re.compile("regex2\d")
re_dict = {regex1 : "stuff", regex2 : "otherstuff"}
match_multiple = "|".join(list(re_dict.keys()))
string = 'regex25'
if re.match(match_multiple, string):
    print("matched")

Это дает:

Traceback (most recent call last):
   File "./a.py", line 7, in <module>
    match_multiple = "|".join(list(re_dict.keys()))
TypeError: sequence item 0: expected str instance, re.Pattern found

1 Ответ

0 голосов
/ 14 января 2019

str.join работает с строками , а не re объектами. Присоединяйтесь , затем скомпилируйте.

regex1 = "regex1.*"
regex2 = "regex2\d"
re_dict = {regex1 : "stuff", regex2 : "otherstuff"}
match_multiple = re.compile("|".join(re_dict))

обратите внимание, что dicts не упорядочены (если вы не используете python 3.6), поэтому, если порядок выражений имеет значение, ваш код может быть неправильным

Также обратите внимание на упрощение с list(re_dict.keys()) до re_dict, поскольку итерация по словарю дает свои ключи. Нет необходимости вызывать keys или конвертировать в list явно.

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

Если у вас есть доступ только к предварительно скомпилированным выражениям, то «эмулируйте» регулярное выражение или с помощью any

if any(r.match(string) for r in re_dict):

any коротких замыканий, поэтому он завершается с True, как только совпадает одно регулярное выражение.

Или перестройте шаблон с помощью атрибута pattern regex:

match_multiple = re.compile("|".join([r.pattern for r in re_dict]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...