gpt4 book ai didi

python - 与 re.DOTALL 的非贪婪换行符匹配

转载 作者:行者123 更新时间:2023-11-28 22:39:20 28 4
gpt4 key购买 nike

我正在尝试用 Python 重现这个正则表达式:https://regex101.com/r/tP1bS4/2

示例 entry 数据如下:

[ 10.0.7.58/54648 -> 31.221.26.40/80 (http response) ]-
|
| server = 31.221.26.40/80
| app = ???
| lang = none
| params = anonymous
| raw_sig = 1:Content-Type,?Last-Modified,?Cache-Control,?Expires,Date,Connection=[keep-alive]:Keep-Alive,Accept-Ranges:
|

基本上,我想从第三行开始得到一个包含两个元素的组:服务器 IP 和端口。

这是我的 Python 尝试;

server = re.findall( '\| server[ \s]+= (.*)\/(.*)\n', entry, re.DOTALL)
print server

这给了我这个 server 组:

[('31.221.26.40', '80\n| app      = ???\n| lang     = none\n| params   = anonymous\n| raw_sig  = 1:Content-Type,?Last-Modified,?Cache-Control,?Expires,Date,Connection=[keep-alive]:Keep-Alive,Accept-Ranges:\n|')]

如您所见,它没有在 \n 上拆分。预期结果为:

[('31.221.26.40', '80')]

最佳答案

让我清理一些东西。 re.DOTALL 修饰符使 . 符号匹配任何 符号,包括换行符。带有 DOTALL 的 .* 子模式匹配字符串直到结尾。

如果你使用'\| server[\s]+= (.*)\/(.*)\n',第一个 .* 匹配到最后一个 / 和第二个 .* 与最后一个 \n 匹配,因为它是贪婪的(也就是说,引擎获取字符串的所有其余部分,然后回溯以尝试适应随后的子模式)。

由于您的数据在 1 行上,您不想. 匹配换行符。因此,解决问题的最简单方法是使用

server = re.findall(r'\|\s*server\s*=\s*(.*?)/(.*)', entry)

参见 regex demo

然而,点匹配仅在我们不知道期望的字符时才有用。您可以使用字符类增强正则表达式:

server = re.findall(r'\|\s*server\s*=\s*([^\s/]+)/(\d+)', entry)

另一个regex demo (注意效率提高了 x2 倍)

([^\s/]+)匹配1个或多个除空格和/以外的字符,\d+匹配1个或更多数字。

关于python - 与 re.DOTALL 的非贪婪换行符匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34874853/

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