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