这是文本文件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和s开始匹配1 2来自s2
但为什么?
答案 0 :(得分: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']
答案 1 :(得分:2)
第一组完全匹配 default。
如果groupN参数为零,则相应的返回值为 整个匹配的字符串。
所以你应该跳过它。如果你想要最后一个,请检查group(3)
。
另外,你应该在for循环之前编译regexp。它提高了解析器的性能。
如果您希望匹配(\w)*
之间的所有符号,则可以将(\w*)
替换为:
。