在 Python 中使用正则表达式匹配两个字符串中的 HTML 标签

Posted

技术标签:

【中文标题】在 Python 中使用正则表达式匹配两个字符串中的 HTML 标签【英文标题】:Match HTML tags in two strings using regex in Python 【发布时间】:2011-02-10 00:16:49 【问题描述】:

我想验证源字符串中存在的 html 标记是否也存在于目标字符串中。

例如:

>> source = '<em>Hello</em><label>What's your name</label>'
>> verify_target(’<em>Hi</em><label>My name is Jim</label>')
True
>> verify_target('<label>My name is Jim</label><em>Hi</em>')
True
>> verify_target('<em>Hi<label>My name is Jim</label></em>')
False

【问题讨论】:

使用棘轮匹配猴子、星星和 deco_hand_frog 【参考方案1】:

我会摆脱正则表达式并查看Beautiful Soup。findAll(True) 列出了在您的源代码中找到的所有标签。

from BeautifulSoup import BeautifulSoup 
soup = BeautifulSoup(source)
allTags = soup.findAll(True)
[tag.name for tag in allTags ]
[u'em', u'label']

那么您只需要删除可能的重复项并面对您的标签列表。

这个 sn-p 验证所有源标签都存在于目标标签中。

from BeautifulSoup import BeautifulSoup
def get_tags_set(source):
    soup = BeautifulSoup(source)
    all_tags = soup.findAll(True)
    return set([tag.name for tag in all_tags])

def verify(tags_source_orig, tags_source_to_verify):
    return tags_source_orig == set.intersection(tags_source_orig, tags_source_to_verify)

source= '<label>What\'s your name</label><label>What\'s your name</label><em>Hello</em>'
source_to_verify= '<em>Hello</em><label>What\'s your name</label><label>What\'s your name</label>'
print verify(get_tags_set(source),get_tags_set(source_to_verify))

【讨论】:

是的。你肯定想用 BeautifulSoup。【参考方案2】:

我不认为正则表达式在这里是正确的方式,主要是因为 html 并不总是一个字符串,但它有点复杂,带有嵌套标签。

我建议你使用HTMLParser,创建一个解析原始源代码并在其上构建结构的类。然后验证相同的数据结构对于待验证的目标是否有效。

【讨论】:

以上是关于在 Python 中使用正则表达式匹配两个字符串中的 HTML 标签的主要内容,如果未能解决你的问题,请参考以下文章

如何检测两个正则表达式在它们可以匹配的字符串中是不是重叠?

python基础之正则表达式

python中正则表达式的一些问题

day17-JavaScript正则表达式

Python中使用正则表达式获取两个字符中间部分

python中正则表达式在中文字符串匹配时的坑