2 回答
![?](http://img1.sycdn.imooc.com/54586425000103f602200220-100-100.jpg)
TA贡献1821条经验 获得超4个赞
如果您连续粘贴两个正则表达式,它们将仅连续匹配文本。例如,如果组合a和b,则正则表达式ab将匹配文本ab,但不匹配acb。
您的组合正则表达式遇到了这个问题;您已将正则表达式融合在一起,这些正则表达式显然可以单独工作,但它们与直接相邻的字符串不匹配,因此您必须添加一些填充来覆盖输入中的中间子字符串。
这是一个稍微重构的版本,其中添加了填充,并且还进行了一些常规修复,以避免常见的正则表达式初学者错误。
for item in re.finditer(r'''
(?P<host>\d+\.\d+\.\d+.\d+)
(?:[-\s]+)
(?P<user_name>\w+\d)
(?:[^[]+\[)
(?P<time>[^]]+)
(?:\][^]"]+")
(?P<request>[^"]+)''',
logdata, re.VERBOSE):
print(item.groupdict())
演示: https: //ideone.com/BsNLG7
![?](http://img1.sycdn.imooc.com/54586431000103bb02200220-100-100.jpg)
TA贡献1752条经验 获得超4个赞
我可能会简化您的正则表达式模式并仅re.findall在此处使用:
inp = '146.204.224.152 - feest6811 [21/Jun/2019:15:45:24 -0700] "POST /incentivize HTTP/1.1" 302 4622'
matches = re.findall(r'(\d+\.\d+\.\d+\.\d+) - (\S+) \[(.*?)\] "(.*?)"', inp)
print(matches)
这将生成一个元组列表,其中包含您想要的四个捕获术语:
[('146.204.224.152', 'feest6811', '21/Jun/2019:15:45:24 -0700', 'POST /incentivize HTTP/1.1')]
添加回答
举报