我试图解析下面的输出。
1 192.168.1.1 0.706 ms 0.654 ms 0.697 ms
2 10.10.10.10 4.215 ms 4.199 ms 4.175 ms
3 123.123.123.123 4.000 ms * *
我有正常的表达方式,如下所示。
此正则表达式有效:
re.compile(r'^\s*(\d+)\s+?([\s\S]+?(?=^\s*\d+\s+))', re.M)
这将正确捕获每一行。
('1', ' 192.168.7.1 0.706 ms 0.654 ms 0.697 ms\n')
('2', ' 10.10.10.10 4.215 ms 4.199 ms 4.175 ms\n')
('3', ' 123.123.123.123 4.000 ms * *\n')
我的问题是大胆的?做了什么(?= ^ \ s * \ d + \ s +)
即。将正则表达式更改为如下。
此正则表达式不起作用。唯一的区别是?标记已删除。
re.compile(r'^\s*(\d+)\s+?([\s\S]+(?=^\s*\d+\s+))', re.M)
我试过这个并没有用。它不会单独解析每一行。
有人可以帮我解释这个正则表达式吗?
答案 0 :(得分:2)
根据re docs:
*?
,+?
,??
'\*'
,'+'
和'?'
限定符都是贪婪的;它们匹配尽可能多的文本。有时这种行为是不可取的;如果RE<.*>
与<a> b <c>
匹配,则它将匹配整个字符串,而不仅仅是<a>
。在限定符后添加?
使其以非贪婪或最小化的方式执行匹配;尽可能少的字符将匹配。使用RE<.*?>
只会匹配<a>
。
因此,在您的情况下,[\s\S]+?
将最小匹配空格或非空格字符,而[\s\S]+
会贪婪地匹配尽可能多的字符。
答案 1 :(得分:-1)
该问号本身没有任何意义 - 特定序列(?=
启动了一个正面的前瞻断言&#34;,这基本上要求正则表达式的内容直到下一个关闭paren必须存在于被搜索的字符串中,但不计入正则表达式匹配的一部分。
有几个以(?
开头的高级正则表达式功能 - 有关详细信息,请参阅re模块的文档。这个特定的序列被用于这样的扩展,因为它在正则表达式中没有任何意义 - 开放的paren必须跟着某个东西,并且问号必须先于某个东西。