我有点坚持这个问题,在这里没有发现类似的问题。
我想获取字符串中所有标签元素的列表,例如<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
或HTMLParser
:
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(因为正则表达式可能会变得混乱,因为您最小化所做的假设)。请注意,对于开始标记,如果需要,handle_starttag
中的attrs
参数也可用于检索标记的属性。
使用 or (|) 运算符并记下由运算符分隔的两个模式,它应该可以工作。
参考这个, AND/OR 运算符在正则表达式中如何表示?