了解正则表达式输出以获取匹配字符串之间的字符串

时间:2014-10-16 01:13:25

标签: python regex

我有以下字符串:

'Commenter:\n\sabc\n<!-- one -->\ntext1<!-- two -- -- -->\ntext2<!-- three -->text3\nCommenter'. 

最初,我尝试使用此正则表达式re.findall ( '<!--(.*?)-->', string, re.DOTALL)提取所有注释,这样就为我提供了正确的输出[' one ', ' two -- -- ', ' three ']

然后,我试图得到特定用户的评论&#34; abc&#34;使用以下正则表达式:re.findall ( 'Commenter.*abc.*<!--(.*?)-->.*Commenter', string, re.DOTALL)但我只得到[' three ']

我无法理解输出。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

可能有一种更聪明的方法可以做到这一点,但我会使用两个正则表达式,如下所示:

>>> s='Commenter:\n\sabc\n<!-- one -->\ntext1<!-- two -- -- -->\ntext2<!-- three -->text3\nCommenter'
>>> t=re.search(r'Commenter:.*?abc[^<]*?(.*?)Commenter', s, re.DOTALL).group(1);t
'\n<!-- one -->\ntext1<!-- two -- -- -->\ntext2<!-- three -->text3\n'
>>> re.findall(r'<!([^>]*)>([^<]*)', t)
[('-- one --', '\ntext1'), ('-- two -- -- --', '\ntext2'), ('-- three --', 'text3\n')]

答案 1 :(得分:0)

您只需要在正则表达式中创建第一个和第二个.*即可进行最短的匹配。这可以通过在?

之后添加一个不情愿的量词*来完成
>>> re.findall ( 'Commenter.*?abc.*?<!--(.*?)-->.*Commenter', s, re.DOTALL)
[' one ']
>>> re.findall ( 'Commenter.*?text1.*?<!--(.*?)-->.*Commenter', s, re.DOTALL)
[' two -- -- ']
>>> re.findall ( 'Commenter.*?text2.*?<!--(.*?)-->.*Commenter', s, re.DOTALL)
[' three ']