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

对于更通用的解决方案,请考虑改用BeautifulSoupHTMLParser

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 运算符在正则表达式中如何表示?

相关内容

  • 没有找到相关文章

最新更新