为了账号安全,请及时绑定邮箱和手机立即绑定

Python正则表达式分组查找器

Python正则表达式分组查找器

富国沪深 2023-10-26 17:00:00
输入:146.204.224.152 - feest6811 [21/Jun/2019:15:45:24 -0700] "POST /incentivize HTTP/1.1" 302 4622预期输出:example_dict = {"host":"146.204.224.152", "user_name":"feest6811","time":"21/Jun/2019:15:45:24 -0700","request":"POST /incentivize HTTP/1.1"}我的代码适用于单独分组,例如:for item in re.finditer('(?P<host>\d*\.\d*\.\d*.\d*)',logdata):        print(item.groupdict())Output: {'host': '146.204.224.152'}但我没有通过组合每个组来获得输出。下面是我的代码:for item in re.finditer('(?P<host>\d*\.\d*\.\d*.\d*)(?P<user_name>(?<=-\s)[\w]+\d)(?P<time>(?<=\[).+(?=]))(?P<request>(?<=").+(?="))',logdata):           print(item.groupdict())
查看完整描述

2 回答

?
收到一只叮咚

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


查看完整回答
反对 回复 2023-10-26
?
温温酱

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



查看完整回答
反对 回复 2023-10-26
  • 2 回答
  • 0 关注
  • 77 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信