解释正则表达式

时间:2016-08-29 01:36:42

标签: python regex

我试图解析下面的输出。

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)

我试过这个并没有用。它不会单独解析每一行。

有人可以帮我解释这个正则表达式吗?

2 个答案:

答案 0 :(得分:2)

根据re docs

  

*?+???

     

'\*''+''?'限定符都是贪婪的;它们匹配尽可能多的文本。有时这种行为是不可取的;如果RE <.*><a> b <c>匹配,则它将匹配整个字符串,而不仅仅是<a>。在限定符后添加?使其以非贪婪或最小化的方式执行匹配;尽可能少的字符将匹配。使用RE <.*?>只会匹配<a>

因此,在您的情况下,[\s\S]+?将最小匹配空格或非空格字符,而[\s\S]+会贪婪地匹配尽可能多的字符。

答案 1 :(得分:-1)

该问号本身没有任何意义 - 特定序列(?=启动了一个正面的前瞻断言&#34;,这基本上要求正则表达式的内容直到下一个关闭paren必须存在于被搜索的字符串中,但不计入正则表达式匹配的一部分。

有几个以(?开头的高级正则表达式功能 - 有关详细信息,请参阅re模块的文档。这个特定的序列被用于这样的扩展,因为它在正则表达式中没有任何意义 - 开放的paren必须跟着某个东西,并且问号必须先于某个东西。