Сопоставить строку с несколькими регулярными выражениями с использованием Python - PullRequest
12 голосов
/ 17 января 2012

Есть ли способ узнать, содержит ли строка слова, которые соответствуют набору регулярных выражений? Если у меня есть [regex1, regex2, regex3], и я хочу посмотреть, соответствует ли строка какой-либо из них, как бы я это сделал? Сейчас я использую re.findall(regex1, line), но он соответствует только одному регулярному выражению за раз.

Ответы [ 3 ]

33 голосов
/ 17 января 2012

Вы можете использовать встроенные функции any (или all, если все регулярные выражения должны совпадать) и выражение Generator для прохождения через все объекты регулярных выражений.

any (regex.match(line) for regex in [regex1, regex2, regex3])

(или any(re.match(regex_str, line) for regex in [regex_str1, regex_str2, regex_str2]), если регулярные выражения не являются предварительно скомпилированными объектами регулярных выражений, конечно)

Хотя это будет неэффективно по сравнению с объединением ваших регулярных выражений в одном выражении - если этот код критичен ко времени или процессору, вам следует вместо этого попытаться составить одно регулярное выражение, которое охватывает все ваши потребности, с использованием специального | регулярного выражения оператор для разделения оригинальных выражений. Простой способ объединить все регулярные выражения - использовать оператор строки «join»:

re.match("|".join([regex_str1, regex_str2, regex_str2]) , line)

Хотя объединение регулярных выражений в этой форме может привести к неверным выражениям, если в исходных выражениях уже используется оператор |.

4 голосов
/ 17 января 2012

Попробуйте это новое регулярное выражение: (regex1) | (regex2) | (regex3). Это будет соответствовать строке с любым из трех регулярных выражений в ней.

2 голосов
/ 17 января 2012

Вы можете просмотреть элементы регулярного выражения и выполнить поиск.

regexList = [regex1, regex2, regex3]

line = 'line of data'
gotMatch = False
for regex in regexList:
    s = re.search(regex,line)
    if s:
         gotMatch = True
         break

if gotMatch:
    doSomething()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...