在python中匹配多个正则表达式的文本

okk*_*hoy 4 python regex multiple-matches

我有一个包含11个文件的文本语料库,每个文件大约有190000行.我有10个字符串,其中一个或多个可能出现在上述语料库的每一行中.

当我遇到10个字符串中的任何一个时,我需要记录分别出现在该行中的字符串.循环通过正则表达式为每一行和标记它的蛮力方式需要很长时间.有没有一种有效的方法呢?

我发现了一个帖子(使用Python匹配多个正则表达式的行),它提供了一个TRUE或FALSE输出.但是如何从行中记录匹配的正则表达式:

any(regex.match(line) for regex in [regex1, regex2, regex3])
Run Code Online (Sandbox Code Playgroud)

编辑:添加示例

regex = ['quick','brown','fox']
line1 = "quick brown fox jumps on the lazy dog" # i need to be able to record all of quick, brown and fox
line2 = "quick dog and brown rabbit ran together" # i should record quick and brown
line3 = "fox was quick an rabit was slow" # i should be able to record quick and fox.
Run Code Online (Sandbox Code Playgroud)

通过正则表达式循环并记录匹配的解决方案之一是解决方案之一,但是查看比例(11*190000*10),我的脚本现在运行了一段时间.我需要在我的工作中多次重复这一点.所以我正在寻找一种更有效的方式.

coo*_*tea 6

下面的方法是您想要匹配的情况.如果您需要在触发匹配的列表中使用正则表达式,那么您运气不好并且可能需要循环.

根据您提供的链接:

import re
regexes= 'quick', 'brown', 'fox'
combinedRegex = re.compile('|'.join('(?:{0})'.format(x) for x in regexes))

lines = 'The quick brown fox jumps over the lazy dog', 'Lorem ipsum dolor sit amet', 'The lazy dog jumps over the fox'

for line in lines:
    print combinedRegex.findall(line)
Run Code Online (Sandbox Code Playgroud)

输出:

['quick', 'brown', 'fox']
[]
['fox']
Run Code Online (Sandbox Code Playgroud)

这里的要点是你不要遍历正则表达式,而是将它们组合起来.循环方法的不同之处在于re.findall找不到重叠匹配.例如,如果您的正则表达式为:regexes= 'bro', 'own',则上述行的输出将为:

['bro']
[]
[]
Run Code Online (Sandbox Code Playgroud)

而循环方法将导致:

['bro', 'own']
[]
[]
Run Code Online (Sandbox Code Playgroud)