复杂正则表达式的解释

时间:2015-05-21 08:15:44

标签: python regex

我有一些文字数据如下。

{"Timestamp": "Tue Apr 07 00:32:29 EDT 2015",Title: Indian Herald: India's Latest News, Business, Sport, Weather, Travel, Technology, Entertainment, Politics, Finance <br><br>Product: Gecko<br>CPUs: 8<br>Language: en-GB"}

从下面的文字中,我使用以下正则表达式仅提取标题(Indian Herald: India's Latest News, Business, Sport, Weather, Travel, Technology, Entertainment, Politics, Finance):

appcodename = re.search(r'Title: ((?:(?!<br>).)+)', message).group(1)

我试图了解上述正则表达式的工作原理。

(?!<br>)<br>

的负面预测

(?:(?!<br>).)+) - 这是什么意思?有人可以为我分解它。 此外,正则表达式中有多少个捕获组。

3 个答案:

答案 0 :(得分:3)

你不需要这么复杂的正则表达式来获得标题。使用

Title:\s*(.*?)(?=\s*<br/?>)

请参阅demo

我们匹配Title:,然后是空格\s*,然后是<br/>(.*?)(?=\s*<br/?>)匹配的任何字符。

对于(?:(?!<br>).)+,这意味着捕获1个或多个未跟<br> 的字符。有SO post where this construction is explained in detail

以下是来自regex101的图片(转到正则表达式调试器标签,然后点击右侧的+),可视化显示该结构正在做什么(检查是否下一个字符是<br>,如果没有,则消费和回溯等等):

enter image description here

关于正则表达式中有多少个捕获组的问题Title: ((?:(?!<br>).)+)有1个捕获(((?:(?!<br>).)+))和1个非捕获({{1 }})groups。

答案 1 :(得分:2)

首先,你不需要在这里预见到。你也可以使用这个简单的正则表达式来完成你的工作:

>>> re.search(r'Title: *(.+?) *<br>', message).group(1)
"Indian Herald: India's Latest News, Business, Sport, Weather, Travel, Technology, Entertainment, Politics, Finance"

你的正则表达式:

Title: ((?:(?!<br>).)+)

正在使用negative lookahead (?!<br>),在文字<br>之后匹配字符之前检查Title:的存在。

答案 2 :(得分:1)

Person person = new Person("John", ":"Henry, "john@henry.com"); aApi.sendDetails(person, ACCESS_KEY, new Callback<User>() { @Override public void success(User user, Response response) { } @Override public void failure(RetrofitError error) { } }); } 的含义是:

((?:(?!<br>).)+)