Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
findall()行为(python 2.7)_Python_Findall - Fatal编程技术网

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