python-3.x - Python re.findall 仅返回第一个匹配项
问题描述
我对此有点坚持,在这里没有发现类似的问题。
我想获取字符串中所有标签元素的列表,例如<a>
->a
或</b>
->b
import re
s = '<p><a href="http://www.quackit.com/html/tutorial/html_links.cfm">Example Link</a></p>'
pat = r'<\s*(\w+)/?\s*.*>'
tags = re.findall(pat, s)
print(tags)
结果我得到['p']
了这里。如果我将其更改为\w+
,[a-d]+
我就会得到['a']
结果。
我希望结果['p', 'a', 'a', 'p']
或至少所有不同的标签值。
我在这里做错了什么?谢谢!
使用 Python 3.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)
输出:
['p', 'a', 'a', 'p']
对于更通用的解决方案,请考虑使用BeautifulSoup
orHTMLParser
代替:
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']
该方法适用于任意 HTML(因为当您最小化所做的假设时,正则表达式可能会变得混乱)。注意,对于开始标签,attrs
参数 inhandle_starttag
也可以用来检索标签的属性,如果你需要的话。
推荐阅读
- oop - 单体架构和 SOA 的区别
- javascript - 如果一个承诺可以被拒绝,那么我们应该如何处理它,或者甚至不处理它或抓住它?
- c++ - 包含范围时如何在 int 函数中返回值?
- rust - 如何防止 Rust 程序释放()它不拥有的 C 字节
- soap - 空手道 - 我们如何查看从文件调用功能文件中的请求时发送的确切请求和输入参数
- python - XGBoost 训练时间似乎太长了
- django - Django 模型中的 DRY 字段
- java - 无法从java中的密钥库加载私钥
- php - API平台测试授权
- angular - 在 Angular Typescript 中将正则表达式验证器与 Or 运算符结合使用