Сопоставить строку с несколькими регулярными выражениями с использованием Python

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

3 ответа

Решение

Вы можете использовать встроенные функции 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)

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

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

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

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()
#quite new to python but had the same problem. made this to find all with multiple 
#regular #expressions.

    regex1 = r"your regex here"
    regex2 = r"your regex here"     
    regex3 = r"your regex here"
    regexList = [regex1, regex1, regex3]

    for x in regexList:
    if re.findall(x, your string):
        some_list = re.findall(x, your string)     
        for y in some_list:
            found_regex_list.append(y)#make a list to add them to.
Другие вопросы по тегам