【发布时间】:2016-01-19 10:51:11
【问题描述】:
我正在尝试在 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')]
【问题讨论】:
-
如果您删除 DOTALL,它应该可以按预期工作。
-
@WiktorStribiżew 谢谢,它确实有效,但为什么会这样?
-
因为带有 DOTALL 的
.匹配换行符。无论如何,您的模式效率低下。应该是server = re.findall(r'\| server\s+= ([^/]*)/(\d+)', entry)。 -
@WiktorStribiżew 谢谢!我实际上已经用
\| server[ \s]+= (.*)\/(.*?)\n解决了这个问题,现在我知道了,尽管在这种情况下你的也可以。 -
那个模式又很糟糕……不过你觉得够用就可以用。