正则表达式 - 将连字符后的文本提取到 Python 中的字典中
Posted
技术标签:
【中文标题】正则表达式 - 将连字符后的文本提取到 Python 中的字典中【英文标题】:Regex - Extracting text after a hyphen into a dictionary in Python 【发布时间】:2021-04-05 04:51:16 【问题描述】:我正在尝试将数据从日志中提取到字典中。这是第一行的样子:
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'
【问题讨论】:
【参考方案1】:首先有一个错字,(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 中的字典中的主要内容,如果未能解决你的问题,请参考以下文章