1

我正在尝试使用正则表达式肯定后向创建字典列表。我尝试了两种不同的代码:

变体 1

string = '146.204.224.152 - lubo233'

for item in re.finditer( "(?P<host>[0-9]*[.][0-9]*[.][0-9]*[.][0-9]*)(?P<user_name>(?<= - )[a-z]*[0-9]*)", string ):
    print(item.groupdict())

变体 2

string = '146.204.224.152 - lubo233'
for item in re.finditer( "(?P<host>[0-9]*[.][0-9]*[.][0-9]*[.][0-9]*)(?<= - )(?P<user_name>[a-z]*[0-9]*)", string ):
    print(item.groupdict())

期望的输出

{'host': '146.204.224.152', 'user_name': 'lubo233'}

问题/问题

在这两种情况下,我都无法消除子字符串“-”。

使用正向后视(?<= - )会使我的代码出错。

任何人都可以帮助确定我的错误吗?谢谢。

4

2 回答 2

2

我建议您删除积极的后视,并在每个部分之间正常放置连接字符

还有一些改进

  • \.代替[.]

  • [0-9]{,3}代替[0-9]*

  • (?:\.[0-9]{,3}){3}代替\.[0-9]{,3}\.[0-9]{,3}\.[0-9]{,3}

添加一个.*以及-处理任何可能存在的单词

rgx = re.compile(r"(?P<host>[0-9]{,3}(?:\.[0-9]{,3}){3}).* - (?P<user_name>[a-z]*[0-9]*)")

vals = ['146.204.224.152 aw0123 abc - lubo233',
        '146.204.224.152 as003443af - lubo233',
        '146.204.224.152 - lubo233']

for val in vals:
    for item in rgx.finditer(val):
        print(item.groupdict())

# Gives
{'host': '146.204.224.152', 'user_name': 'lubo233'}
{'host': '146.204.224.152', 'user_name': 'lubo233'}
{'host': '146.204.224.152', 'user_name': 'lubo233'}
于 2020-11-28T10:11:38.653 回答
1

积极向后看不起作用的原因是您正在尝试匹配:

  • (?P<host>[0-9]*[.][0-9]*[.][0-9]*[.][0-9]*)IP地址
  • 紧随其后的是用户名模式(?P<user_name>(?<= - )[a-z]*[0-9]*)前面应该是(?<= - )

因此,一旦正则表达式引擎使用了IP 地址模式,您就告诉它应该匹配前面的用户名模式(?<= - ),但前面的是IP 地址模式。换句话说,一旦匹配了IP 模式,剩下的字符串就是:

- lubo233

应该立即匹配的模式,如re.match,是:

(?P<user_name>(?<= - )[a-z]*[0-9]*) 

那显然不匹配。为了说明我的观点,请查看此模式是否有效:

import re

string = '146.204.224.152 - lubo233'
for item in re.finditer(r"((?P<host>[0-9]*[.][0-9]*[.][0-9]*[.][0-9]*)( - ))(?P<user_name>(?<= - )[a-z]*[0-9]*)", string):
    print(item.groupdict())

输出

{'host': '146.204.224.152', 'user_name': 'lubo233'}

如果您需要在两种模式之间匹配任意数量的字符,您可以这样做:

import re

string = '146.204.224.152 adfadfa - lubo233'
for item in re.finditer(r"((?P<host>\d{3,}[.]\d{3,}[.]\d{3,})(.* - ))(?P<user_name>(?<= - )[a-z]*[0-9]*)", string):
    print(item.groupdict())

输出

{'host': '146.204.224', 'user_name': 'lubo233'}
于 2020-11-28T10:28:08.370 回答