web-dev-qa-db-ja.com

Python:リスト内の少なくとも1つの正規表現が文字列と一致するかどうかを確認するエレガントな方法

Pythonの正規表現のリストと文字列があります。リスト内の少なくとも1つの正規表現が文字列と一致するかどうかを確認するエレガントな方法はありますか?エレガントというのは、単にすべての正規表現をループして文字列と照合し、一致するものが見つかったら停止するよりも良いことを意味します。

基本的に、私はこのコードを持っていました:

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

ここで、単なる文字列ではなく、正規表現をリストに追加したいと思います。if string in list:を置き換える一致をチェックするエレガントなソリューションがあるかどうか疑問に思っています。

前もって感謝します。

51
houbysoft
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!"
81
Ned Batchelder
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!'
88
nosklo

ネッドとノスクロの両方の答えのミックス。任意の長さのリストに対して保証された動作...お楽しみください

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")
4
Anderas

他の回答に基づいて私が行ったものは次のとおりです。

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")
3
user5056973

文字列をループすると、時間の複雑さはO(n)になります。より良いアプローチは、これらの正規表現を正規表現トライとして組み合わせることです。

1
ospider