我有一些文字数据如下。
{"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>).)+)
- 这是什么意思?有人可以为我分解它。
此外,正则表达式中有多少个捕获组。
答案 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>
,如果没有,则消费和回溯等等):
关于正则表达式中有多少个捕获组的问题,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>).)+)