Python:检查列表中至少有一个正则表达式是否匹配字符串的优雅方法

hou*_*oft 52 python regex list

我有一个python中的正则表列表和一个字符串.有没有一种优雅的方法来检查列表中的至少一个正则表达式是否与字符串匹配?通过优雅,我的意思是比简单地循环遍历所有正则表达式并检查字符串并在找到匹配时停止更好.

基本上,我有这个代码:

list = ['something','another','thing','hello']
string = 'hi'
if string in list:
  pass # do something
else:
  pass # do something else
Run Code Online (Sandbox Code Playgroud)

现在我想在列表中有一些正则表达式,而不仅仅是字符串,我想知道是否有一个优雅的解决方案来检查匹配替换if string in list:.

提前致谢.

nos*_*klo 90

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!'
Run Code Online (Sandbox Code Playgroud)

  • 这如何*“比简单地遍历所有正则表达式并根据字符串检查它们并在找到匹配项时停止更好的东西”*?我想 Ned 和这个答案的结合可能是一个胜利者…… (3认同)

Ned*_*der 85

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!"
Run Code Online (Sandbox Code Playgroud)

  • 因为“qu*x”意味着 q、零个或多个 u 和一个 x。 (4认同)
  • 如果你不需要知道哪一个匹配,最好用`(?:regex)`而不是`(正则表达式)括起它们. (3认同)
  • `regexes ='(?:%s)'%'|'.join(regexes)` (3认同)
  • 如果数组中有超过100个正则表达式,则此方法不起作用(Python 2.6).试试下面的nosklo的答案. (2认同)

use*_*973 9

这是我根据其他答案所寻求的:

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")
Run Code Online (Sandbox Code Playgroud)


And*_*ras 5

Ned和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")
Run Code Online (Sandbox Code Playgroud)