正则表达式 - 将连字符后的文本提取到 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&lt;user_name&gt;一定是(?P&lt;user_name&gt;

正则表达式引擎从左到右解析字符串(至少默认情况下,支持从右到左解析的正则表达式库并不多)。该字符串逐个字符地读取,并尝试将这些字符与模式匹配。它不能跳过消费子模式之间的部分字符串(即那些使正则表达式索引前进的子模式,即非环视)。因此,(?&lt;=- )* 是一个正向的后视,需要一个-,并且空格立即在当前位置的左侧,零次或多次 由于 * 在它之后。这个* 量词使得在这里使用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 中的字典中的主要内容,如果未能解决你的问题,请参考以下文章

C#正则表达式如何提取一段字符串中汉字后的数字

正则表达式,选择特定字符串后的数字

获取正则表达式匹配后的文本

Java正则表达式提取标签之间的文本

Jmeter利用正则表达式提取响应值

文本提取——正则表达式