-1

假设我在文件 testFile 中有以下几行:

Test Line in File
Test Line in File
Test Line in File
Test Line in File Line
Test Line in File Line

是否可以做一个 re.findall() 让我每行找到一个“模式”实例?例如,如果我执行 len(re.findall("Line", testfile, 0)),程序将返回 7。我希望它返回 5。我正在考虑类似“Line.*\n”之类的东西,但是这仍然会返回 7。为了澄清,我想避免使用:

count = 0
with open(testFile, "r") as file:
    for line in file:
        re.match(pattern, testFile, 0)
        #etc

任何帮助表示赞赏。

4

3 回答 3

1

你可以使用行标志!

>>> s = """Test Line in File
... Test Line in File
... Test Line in File
... Test Line in File Line
... Test Line in File Line"""
>>> r = re.compile("^.*Line.*$", flags=re.MULTILINE)
>>> r.findall(s)
['Test Line in File',
 'Test Line in File',
 'Test Line in File',
 'Test Line in File Line',
 'Test Line in File Line']

但是,在这种情况下,我不鼓励使用正则表达式!

于 2013-06-10T19:50:35.763 回答
1

这么简单的匹配,用这个效率更高……

count = 0
with open(testFile, "r") as file:
    for line in file:
        if 'Line' in line:
            count += 1

...它使用高度优化的搜索算法,比使用正则表达式要快得多(我上次检查的速度大约快 8 倍)。

于 2013-06-10T19:49:30.137 回答
0

将整个文件加载到内存中是没有意义的re.findall,这样做你会失去在找到第一个匹配项时短路的能力

import re
with open('data.txt') as f:
    print sum(1 if re.search(r"Line", line) else 0 for line in f)  

5
于 2013-06-10T19:47:58.520 回答