Python正则表达式中方括号[]的行为

3

这是文本文件 abc.txt。

abc.txt

aa:s0:education.gov.in
bb:s1:defence.gov.in
cc:s2:finance.gov.in

我将尝试使用以下正则表达式在每个冒号处进行标记化(如果术语不正确,请纠正我)来解析此文件。 parser.py
import re,sys,os,subprocess
path = "C:\abc.txt"
site_list = open(path,'r')
for line in site_list:
    site_line = re.search(r'(\w)*:(\w)*:([\w\W]*\.[\W\w]*\.[\W\w]*)',line)
    print('Regex found that site_line.group(2) = '+str(site_line.group(2))

为什么输出的结果是:
Regex found that site_line.group(2) = 0
Regex found that site_line.group(2) = 1
Regex found that site_line.group(2) = 2

请问有人能帮我理解为什么它匹配第二组的最后一个字符吗?我认为它从s0匹配0,从s1匹配1,从s2匹配2。

但是为什么呢?


为什么你在使用re.search而不是re.match - Jimilian
2
正则表达式对于你想要完成的任务来说有些过头了。只需在冒号上拆分该行,您就可以将元素作为列表获取(line.split(':'))。 - Darrick Herwehe
“overkill”是什么意思?这是否意味着用一种相对复杂的方式来实现简单的事情?:) 或者它会比line.split(':')慢吗?谢谢,我会使用line.split,但我也在学习正则表达式,所以才会问这个问题 :) - Dhiwakar Ravikumar
2个回答

3

让我们展示一个简化的例子:

>>> re.search(r'(.)*', 'asdf').group(1)
'f'
>>> re.search(r'(.*)', 'asdf').group(1)
'asdf'

如果您在捕获组周围有一个重复运算符,该组将存储最后一次重复。将该组放在重复运算符周围将实现您想要的效果。
如果您希望看到第三个组的数据,则应使用group(3)group(0)是整个匹配,而group(1)group(2)等则计算实际括号捕获组。
话虽如此,正则表达式对于此任务来说可能过于复杂。
>>> 'aa:s0:education.gov.in'.split(':')
['aa', 's0', 'education.gov.in']

2
第一组是整个匹配,使用default。如果groupN参数为零,则对应的返回值是完整的匹配字符串。因此,你应该跳过它,并检查group(3),如果你想要最后一个。此外,你应该在for循环之前编译正则表达式。这将提高解析器的性能。如果你想匹配冒号之间的所有符号,可以将(\w)*替换为(\w*)。

虽然预编译可能有好处,但性能提升是值得怀疑的 - Darrick Herwehe
@interjay,这个答案是基于我的结论。1)OP问,方括号[]有什么问题。只有最后一组有方括号。所以,我决定OP想要打印最后一组。2)OP没有使用group(0),但我认为OP想要打印最后一组。但他正在使用group(2)来实现这个目的。这有什么问题,因为group(0)是“bonus”。 - Jimilian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接