2016-08-29 134 views
-1

我试图解析看起来像下面的输出。解释正则表达式

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

按照re docs

*?+???

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

所以你的情况,[\s\S]+?将匹配一个空格或无空格字符最小,而[\s\S]+将贪婪的尽可能多的字符,因为它可以匹配。

+0

非常感谢! – sh0731

-1

该问号本身没有意义 - 特定序列(?=开始“肯定超前断言”,它基本上要求正则表达式中的内容必须存在于正在搜索的字符串中,但不算作正则表达式匹配的一部分。

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