Python: элегантный способ проверить, соответствует ли хотя бы одно регулярное выражение в списке строке - PullRequest
50 голосов
/ 15 июня 2010

У меня есть список регулярных выражений в Python и строка.Есть ли элегантный способ проверить, соответствует ли строка хотя бы одному регулярному выражению в списке?Под элегантностью я подразумеваю нечто лучшее, чем просто циклически повторять все регулярные выражения и проверять их на соответствие строке и останавливать, если найдено совпадение.

По сути, у меня был такой код:

list = ['something','another','thing','hello']
string = 'hi'
if string in list:
  pass # do something
else:
  pass # do something else

Теперь я хотел бы иметь в списке некоторые регулярные выражения, а не просто строки, и мне интересно, есть ли элегантное решение для проверки на совпадение вместо if string in list:.

Заранее спасибо.

Ответы [ 5 ]

86 голосов
/ 15 июня 2010
import re

regexes = [
    # your regexes here
    re.compile('hi'),
#    re.compile(...),
#    re.compile(...),
#    re.compile(...),
]

mystring = 'hi'

if any(regex.match(mystring) for regex in regexes):
    print 'Some regex matched!'
78 голосов
/ 15 июня 2010
import re

regexes = [
    "foo.*",
    "bar.*",
    "qu*x"
    ]

# Make a regex that matches if any of our regexes match.
combined = "(" + ")|(".join(regexes) + ")"

if re.match(combined, mystring):
    print "Some regex matched!"
4 голосов
/ 30 октября 2017

Смесь ответов Неда и Носкло.Работы гарантированы для любой длины списка ... надеюсь, вам понравится

import re   
raw_lst = ["foo.*",
          "bar.*",
          "(Spam.{0,3}){1,3}"]

reg_lst = []
for raw_regex in raw_lst:
    reg_lst.append(re.compile(raw_regex))

mystring = "Spam, Spam, Spam!"
if any(compiled_reg.match(mystring) for compiled_reg in reg_lst):
    print("something matched")
3 голосов
/ 28 декабря 2018

Вот что я сделал, основываясь на других ответах:

raw_list = ["some_regex","some_regex","some_regex","some_regex"]
reg_list = map(re.compile, raw_list)

mystring = "some_string"

if any(regex.match(mystring) for regex in reg_list):
    print("matched")
1 голос
/ 15 декабря 2018

Если вы зациклите строки, сложность времени будет O (n). Лучшим подходом было бы объединить эти регулярные выражения в качестве регулярного выражения.

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