findall()行为(python 2.7)
假设我有以下字符串:findall()行为(python 2.7),python,findall,Python,Findall,假设我有以下字符串: "<p>Hello</p>NOT<p>World</p>" 我对剥离和不是特别感兴趣,所以我从不在脚本中进行剥离 翻译打印 ['<p>Hello</p>NOT<p>World</p>'] ['你好不是世界'] 因此,它显然看到了第一个和最后一个,而忽略了中间的标记。但是findall()不应该返回所有三组匹配字符串吗?(打印的字符串和两个单词) 如果不应该,我如何修改代码来
"<p>Hello</p>NOT<p>World</p>"
我对剥离和不是特别感兴趣,所以我从不在脚本中进行剥离
翻译打印
['<p>Hello</p>NOT<p>World</p>']
['你好不是世界']
因此,它显然看到了第一个和最后一个,而忽略了中间的标记。但是findall()
不应该返回所有三组匹配字符串吗?(打印的字符串和两个单词)
如果不应该,我如何修改代码来做到这一点
PS:这是为了一个项目,我找到了一种替代方法来做我需要做的事情,所以我想这是出于教育原因。你在一次匹配中获得全部内容的原因是因为
[\w\w]+
将匹配尽可能多的内容(包括你所有的和标记)。为了防止这种情况发生,您希望通过附加?
来使用非贪婪版本
match = re.findall(r"(<p>[\w\W]+?</p>)", string)
# ['<p>Hello</p>', '<p>World</p>']
不过,作为补充说明,如果您试图用正则表达式解析HTML或XML,最好使用一个库,例如用于解析HTML的库。非常感谢。我想我忽略了REsI的一部分也会研究BeautifulSoup,谢谢你的建议。+1代表BeautifulSoup(或类似)。HTML不是正则语言,所以正则表达式不是解析它们的好工具。只使用一个理解HTML的库会容易得多。
match = re.findall(r"(<p>[\w\W]+?</p>)", string)
# ['<p>Hello</p>', '<p>World</p>']
match = re.findall(r"((?<=<p>)\w+?(?=</p>))", string)
# ['Hello', 'World']