繁体   English   中英

Square Brackets []的Python正则表达式行为

[英]Python Regex behaviour with Square Brackets []

这是文本文件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,从s2和s2匹配1

但为什么 ?

让我们看一个简化的例子:

>>> 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']

第一组 默认 为完全匹配

如果groupN参数为零,则相应的返回值是整个匹配字符串。

所以你应该跳过它。 并检查group(3) ,如果你想要最后一个。

此外,您应该在for循环之前编译regexp。 它提高了解析器的性能。

你可以将(\\w)*替换为(\\w*) ,如果你想匹配所有符号:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM