python中正则表达式的匹配列表

python中正则表达式的匹配列表,python,regex,Python,Regex,我有如下正则表达式列表: regexes = [ re.compile(r"((intrigued)(.*)(air))"), re.compile(r"(air|ipadair)(.*)(wishlist|wish)"), re.compile(r"(replac(ed|ing|es|.*)(.*)(with)(.*)(air))"), re.compile(r"(upgrade)")] for regex in regexes: if reg

我有如下正则表达式列表:

regexes = [   
    re.compile(r"((intrigued)(.*)(air))"),
    re.compile(r"(air|ipadair)(.*)(wishlist|wish)"),
    re.compile(r"(replac(ed|ing|es|.*)(.*)(with)(.*)(air))"),
    re.compile(r"(upgrade)")]
for regex in regexes:
      if regex.search(post):
           print 1
           break
假设我有一长串字符串,我想在每个字符串中搜索这些正则表达式,如果其中任何正则表达式匹配return1和break。然后对下一个字符串执行相同的操作。我目前的一个运行非常慢,请让我知道是否有更好的选择


谢谢,

正如一些评论所提到的,这似乎不是正则表达式的工作。我认为值得一看的是,你在这里到底想做什么。看看其中一个正则表达式:

"(air|ipadair)(.*)(wishlist|wish)"
在本例中,我们匹配的是“air”或“ipadair”,但只有“air”将匹配这两个。“愿望”也是如此。由于我们没有使用捕获组,因此输出可以简化为:

"air.*wish"
所有其他模式也是如此,这就引出了一个问题:这个正则表达式实际上在做什么

看起来你只是想看看你的文章中是否有特定的单词模式出现在文章中。如果这是真的,那么我们可以在不使用正则表达式的情况下在python中更快地实现这一点:

def has_phrases(in_string, phrases):
    for words in phrases:
        start = 0
        match = True

        # Match all words
        for word in words:
            # Each word must come after the ones before
            start = in_string.find(word, start)
            if start == -1:
                match = False
                break

        if match:
            return True

phrases = [
    ['upgrade'],
    ['air', 'wish'],
    ['intrigued', 'air'],
    ['replac', 'with', 'air' ],
]

print has_phrases("... air ... wish ...", phrases)      # True!
print has_phrases("... horse ... magic ...", phrases)   # None
当然,如果你只是给出了一个简单的例子,并且你计划使用非常复杂的正则表达式,这并不能解决问题


希望有帮助

正则表达式很慢。根据我的经验,仅仅做
re.search(substr,str)
大约比str中的
substr慢一个数量级,而且你的正则表达式要复杂得多。我认为您不会从中获得太多的加速,但是您可以通过
any(regex.search(post)for regex in regexes)
实现类似的功能。。它不是真的更快,只是更简单。做一些基准测试,找出你的正则表达式中平均返回速度最快的,然后按顺序应用它们。如果对输入和正则表达式有意义的话,可能也值得尝试预筛选,例如对第一个字母进行预筛选。第三个正则表达式包含特别慢的|*(*)。