我有以下字符串:
'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 ']
。
我无法理解输出。有人可以帮忙吗?
答案 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 ']