Python 3.x Python re.findall只返回第一个匹配项

Python 3.x Python re.findall只返回第一个匹配项,python-3.x,regex,findall,re,Python 3.x,Regex,Findall,Re,我有点被这个问题困扰,在这里没有发现类似的问题 我想获得字符串中所有标记元素的列表,例如' pat=r'' 标签=关于findall(帕特,s) 打印(标签) 结果,我得到了['p']。如果我将\w+更改为[a-d]+,我只会得到['a'] 我希望结果是['p','a','a','p']或者至少是所有不同的标记值 我做错了什么?谢谢大家! 首先,使用Python3.x,您需要使模式匹配非贪婪(将*切换到*?)。您可以在Python中给出的示例中了解更多信息(他们甚至使用HTML标记作为示例!)

我有点被这个问题困扰,在这里没有发现类似的问题

我想获得字符串中所有标记元素的列表,例如

' pat=r'' 标签=关于findall(帕特,s) 打印(标签)
结果,我得到了
['p']
。如果我将
\w+
更改为
[a-d]+
,我只会得到
['a']

我希望结果是
['p','a','a','p']
或者至少是所有不同的标记值

我做错了什么?谢谢大家!


首先,使用Python3.x,您需要使模式匹配非贪婪(将
*
切换到
*?
)。您可以在Python中给出的示例中了解更多信息(他们甚至使用HTML标记作为示例!)

其次,
/?
部分应该在开头,而不是在标记名
\w+
之后

另外,第二个
\s*
是多余的,因为
*
也将捕获空白

import re

s = '<p><a href="http://www.quackit.com/html/tutorial/html_links.cfm">Example Link</a></p>'
pat = r'</?\s*(\w+).*?>'
tags = re.findall(pat, s)
print(tags)

对于更一般的解决方案,考虑使用或替代:

这种方法可以在任意HTML中工作(因为在最小化假设时正则表达式可能会变得混乱)。注意,对于开始标记,
handle_starttag
中的
attrs
参数也可用于检索标记的属性(如果需要)。

使用or(|)运算符并写下由运算符分隔的两个模式,应该可以使用

参照此,,

谢谢,这很有效!字符串只是一个示例,如果标记字符是自动关闭标记,那么它们后面也可以有“/”。一个问题:为什么会这样我认为。*匹配任何字符的0或更多。我真的不明白这是怎么回事?很好,我还更新了我的答案,加入了一个使用Python模块的替代方案,这是一个比使用正则表达式更通用、更可靠的解决方案。@matt444它的正则表达式语法使
*
不贪婪。您可以在Python文档中阅读更多关于这方面的内容——它们甚至使用HTML标记作为示例。
import re

s = '<p><a href="http://www.quackit.com/html/tutorial/html_links.cfm">Example Link</a></p>'
pat = r'</?\s*(\w+).*?>'
tags = re.findall(pat, s)
print(tags)
['p', 'a', 'a', 'p']
from html.parser import HTMLParser

class HTMLTagParser(HTMLParser):

    def handle_starttag(self, tag, attrs):
        tags.append(tag)

    def handle_endtag(self, tag):
        tags.append(tag)

s = '<p><a href="http://www.quackit.com/html/tutorial/html_links.cfm">Example Link</a></p>'
tags = []
parser = HTMLTagParser()
parser.feed(s)
print(tags)
['p', 'a', 'a', 'p']