有什么方法可以获取Match对象的行?
我是编程初学者,使用 python,我正在尝试读取多行文本文件并应用正则表达式来检查每个匹配项,问题是,我需要知道匹配项在文件中的哪一行开始.
file = open(data)
data = file.read()
file.close()
result = re.finditer(r'--(d+)t+.+(?:n--1t+.+)*', data)
for match in result:
...
由于我在开始时阅读了整个文件,因此我使用 finditer 来查找内容中的所有匹配项。有什么方法可以告诉我每场比赛从哪一行开始?我似乎无法在文档中找到任何内容。
回答
Match 对象具有Match.start()和Match.end()方法,可以为您提供匹配开始和结束到整个字符串的偏移量。计算该n点之前的行分隔符的数量以将它们转换为行号。
以下函数计算匹配位置之前的换行符数,将 1 添加到从 1 开始而不是从 0 开始的行数:
def line_for_match(m):
return m.string.count("n", 0, m.start()) + 1
如果你的比赛可以跨越多行,你可能要使用m.end()通过计算在那里计算起点和终点之间的匹配换行符数量n的字符m[0]。
该函数利用该str.count()方法的额外参数将计数限制为输入字符串的一部分(通过 引用Match.string);它们分别是字符串中的开始和结束位置。
演示:
>>> import re
>>> def line_for_match(m):
... return m.string.count("n", 0, m.start()) + 1
...
>>> data = "foosballnbartendernbazarn" * 3
>>> pattern = r"(?:foo|bar)"
>>> print(data)
foosball
bartender
bazar
foosball
bartender
bazar
foosball
bartender
bazar
>>> for m in re.finditer(pattern, data):
... print(f"{line_for_match(m)}: {m[0]}")
...
1: foo
2: bar
4: foo
5: bar
7: foo
8: bar