Python分组反向引用

Python分组反向引用,python,html,regex,html-parsing,Python,Html,Regex,Html Parsing,我正在清理一些可能源于所见即所得的html的输出。为了理智起见,我想去掉一堆空的格式标签 e、 g 这里有一些文本,还有更多 多亏了,我有一个整洁的正则表达式,带有一个反向引用,可以一次打开一层 # Returns a string minus one level of empty formatting tags def remove_empty_html_tags(input_string): return re.sub(r'<(?P<tag>strong|span

我正在清理一些可能源于所见即所得的
html
的输出。为了理智起见,我想去掉一堆空的格式标签

e、 g

这里有一些文本,还有更多
多亏了,我有一个整洁的正则表达式,带有一个反向引用,可以一次打开一层

# Returns a string minus one level of empty formatting tags
def remove_empty_html_tags(input_string):
    return re.sub(r'<(?P<tag>strong|span|em)\b[^>]*>(\s*)</(?P=tag)>', r'\1', input_string)
#返回一个字符串减去一级空格式标记
def删除空的html标签(输入字符串):
返回re.sub(r']*>(\s*),r'\1',输入字符串)
但是,我希望能够一次打开
的所有层,并且可能有5+层嵌套的空标记


有没有一种方法可以将backref分组为la
(?:这对于HTML解析器来说要容易得多,例如:

from bs4 import BeautifulSoup

soup = BeautifulSoup("""
<body>
    <em></em> Here's some <span><strong>text</strong></span> <strong>   </strong> and here's more <em> <span></span></em>
</body>
""")

for element in soup.findAll(name=['strong', 'span', 'em']):
    if element.find(True) is None and (not element.string or not element.string.strip()):
        element.extract()

print soup
从bs4导入美化组
汤=美汤
这里有一些文本,还有更多
""")
对于soup.findAll中的元素(名称=['strong','span','em']):
如果element.find(True)为None和(不是element.string或不是element.string.strip()):
element.extract()
印花汤
印刷品:

<html><body>
 Here's some <span><strong>text</strong></span>  and here's more <em> </em>
</body></html>

这里有一些文本,还有更多
如您所见,所有内容为空(或仅包含空格)的
span
strong
em
标记都已删除

另见:

如果你真的不想使用,也不太关心速度(我想你不会,或者你不会使用正则表达式来清理HTML),你可以修改你已经编写的代码。只需将替换项放入循环(或递归;你的首选项)中,在不更改任何内容时返回即可

# Returns a string minus all levels of empty formatting tags
def remove_empty_html_tags(input_string):
    matcher = r'<(?P<tag>strong|span|em)\b[^>]*>(\s*)</(?P=tag)>'
    old_string = input_string
    new_string = re.sub(matcher, r'\1', old_string)
    while new_string != old_string:
        old_string = new_string
        new_string = re.sub(matcher, r'\1', new_string)
    return new_string
#返回一个字符串减去所有级别的空格式标记
def删除空的html标签(输入字符串):
匹配器=r']*>(\s*)'
旧字符串=输入字符串
新字符串=re.sub(匹配器,r'\1',旧字符串)
新字符串!=旧字符串时:
旧字符串=新字符串
新字符串=re.sub(匹配器,r'\1',新字符串)
返回新字符串

这就是为什么人们告诉你不要使用正则表达式来解析HTML。改用HTML解析器。你需要在嵌套层上有一个严格的上限……而且正则表达式的每一个潜在值都会变得更长(更复杂)layer@MartijnPieters然后,在树上遍历查找
re.match(“^\s*$”,innerText)
?@Michael:至少对于BeautifulSoup是这样。小心,
element.string在有嵌套元素时为None
;这些元素可能有文本。@MartiInputers谢谢,我添加了
element.find(True)是None
条件,应该会有帮助。谢谢,alecxe。不过,我希望在第一次通过时也会删除空的
。@Michael这是因为em标记中包含一个span标记。这里最简单的解决方案是多次运行“筛选”代码。