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

2024-06-26 05:03:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下字符串:

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

最初,我试图用这个regexp re.findall ( '<!--(.*?)-->', string, re.DOTALL)提取所有注释,它给了我正确的输出[' one ', ' two -- -- ', ' three ']

然后,我尝试使用以下regexp获取特定用户“abc”的注释:re.findall ( 'Commenter.*abc.*<!--(.*?)-->.*Commenter', string, re.DOTALL),但只得到[' three ']

我无法理解输出。有人能帮忙吗


Tags: 字符串restringonethreeabcregexptwo
2条回答

您只需要在regex中创建第一个和第二个.*,以进行尽可能短的匹配。这可以通过在*之后添加一个不情愿的量词?来实现

>>> 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 ']

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

>>> 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')]

相关问题 更多 >