我有一个包含11个文件的文本语料库,每个文件大约有190000行。 我有10个字符串,其中一个或多个可能出现在上述语料库的每一行中。
当我遇到10个字符串中的任何一个时,我需要分别记录该行中出现的字符串。 循环通过正则表达式为每一行和标记它的蛮力方式需要很长时间。有没有一种有效的方法呢?
我找到了一个提供TRUE或FALSE输出的帖子(Match a line with multiple regex using Python)。但是如何从行中记录匹配的正则表达式:
any(regex.match(line) for regex in [regex1, regex2, regex3])
编辑:添加示例
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.
循环使用正则表达式并记录匹配的解决方案之一,但是看一下(11 * 190000 * 10),我的脚本现在运行了一段时间。我需要在我的工作中多次重复这一点。所以我正在寻找一种更有效的方式。
答案 0 :(得分: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)
输出:
['quick', 'brown', 'fox']
[]
['fox']
这里的要点是你不要遍历正则表达式而是将它们组合起来。
与循环方法的不同之处在于re.findall
将找不到重叠匹配。例如,如果您的正则表达式为:regexes= 'bro', 'own'
,则上述行的输出将为:
['bro']
[]
[]
而循环方法会导致:
['bro', 'own']
[]
[]
答案 1 :(得分:1)
如果您只是尝试匹配文字字符串,那么可能更容易做到:
strings = 'foo','bar','baz','qux'
regex = re.compile('|'.join(re.escape(x) for x in strings))
然后你可以一次测试整个事情:
match = regex.match(line)
当然,您可以从生成的MatchObject中获取匹配的字符串:
if match:
matching_string = match.group(0)
行动中:
import re
strings = 'foo','bar','baz','qux'
regex = re.compile('|'.join(re.escape(x) for x in strings))
lines = 'foo is a word I know', 'baz is a word I know', 'buz is unfamiliar to me'
for line in lines:
match = regex.match(line)
if match:
print match.group(0)
您似乎真的想要搜索字符串以获取正则表达式。在这种情况下,无论您做什么,都需要使用re.search
(或某些变体),而不是re.match
。只要您的正则表达式没有重叠,您就可以使用我上面发布的re.findall
解决方案:
matches = regex.findall(line)
for word in matches:
print ("found {word} in line".format(word=word))