4

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

当我遇到这 10 个字符串中的任何一个时,我需要分别记录出现在该行中的那个字符串。为每一行循环遍历正则表达式并标记它的蛮力方式需要很长时间。有没有一种有效的方法来做到这一点?

我找到了一个帖子(使用 Python 匹配具有多个正则表达式的行),它提供了 TRUE 或 FALSE 输出。但是如何从该行记录匹配的正则表达式:

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),我的脚本现在运行了一段时间。我需要在我的工作中重复很多次。所以我正在寻找一种更有效的方法。

4

2 回答 2

7

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

根据您提供的链接

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']
[]
[]
于 2012-10-23T12:53:28.267 回答
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))

于 2012-10-23T12:36:21.873 回答