gpt4 book ai didi

python - 正则表达式 - 在 Python 中将连字符后的文本提取到字典中

转载 作者:行者123 更新时间:2023-12-04 13:30:17 28 4
gpt4 key购买 nike

我正在尝试将日志中的数据提取到字典中。这是第一行的样子:

146.204.224.152 - feest6811 [21/Jun/2019:15:45:24 -0700] "POST /incentivize HTTP/1.1" 302 4622
我设法将 IP 提取到字典中,但是在尝试获取用户名(在连字符之后)时,我得到以下输出:
{'host': '146.204.224.152', 'user_name': ' '}
这是我正在使用的代码:
for item in re.finditer("(?P<host>[0-9]+(?:\.[0-9]+){3})(P<user_name>(?<=- )*\s)", logdata):
print(item.groupdict())
我是正则表达式的菜鸟。关于我做错了什么的任何建议?
我想要的输出应该是这样的:
{'host': '146.204.224.152', 'user_name': 'feest6811'}

最佳答案

首先,有一个错字,(P<user_name>必须是 (?P<user_name> .
正则表达式引擎从左到右解析一个字符串(至少默认情况下,支持从右到左解析的正则表达式库并不多)。字符串按字符读取,并尝试将这些字符与模式匹配。它不能跳过消费子模式之间的部分字符串(即那些使正则表达式索引前进的,即非环视)。所以,(?<=- )*是一个正面回顾,需要 -由于 * 的原因,和空间立即位于当前位置的左侧,零次或多次之后。此 *量词使得在这里使用lookbehind的整个想法毫无意义,因为它不再需要任何东西。所以,所有这些都用 \s 捕获了一个空格。 .
您所需要的只是消耗日期和用户之间的部分,例如,使用 \s+-\s+\s+\S+\s+ :

(?P<host>[0-9]+(?:\.[0-9]+){3})\s+-\s+(?P<user_name>\S+)
regex demo . \s+-\s+匹配 -用一个或多个空格括起来,和 \s+\S+\s+匹配一个或多个由一个或多个空格包围的非空格字符。

关于python - 正则表达式 - 在 Python 中将连字符后的文本提取到字典中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65477229/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com