使用正则表达式取消标记不会捕获嵌套标记
Detagging with regex does not catch nested tags
在熟悉 Python 3.4 的 re
模块时,我编写了一个函数,目的是删除 XML 标记。我想让它递归以供替代使用:
def detag(text,opentag='<',closetag='>'):
t1 = re.escape(opentag)
t2 = re.escape(closetag)
regex = t1 + '+.*?' + t2 + '+'
result = re.search(regex,text)
if result:
text=text[:result.start()] + text[result.end():]
text = detag(text,opentag,closetag)
return text
问题是函数没有很好地 'pair' 标签。例如:
>>> detag('a<b<c>d>e')
'ad>e'
我想要的输出是 "ae"(因为这些字母没有被 open/close 标签包围),但看起来外部打开标签与内部关闭标签匹配。我很好奇如何重写函数以从 detag('a<b<c>d>e')
获得所需的输出,并且仍然能够从多个内联和 nested/double 标签获得相同类型的输出:
>>> detag('a<b>c<d>e')
'ace'
>>> detag('a<<b>>c')
'ac'
>>> detag('a<b>c<<d>>e')
'ace'
以上示例目前正在按预期工作。重申一下,不应返回打开和关闭标记之间的任何内容。
如果您正在使用 regex package, this recursive pattern 可以工作:
<(?:[^><]|(?R))*>
在 (?R)
或 (?0)
时,模式从头开始粘贴。参见 test at regex101.com
由@noshelter添加:根据此信息,功能可以调整如下...
def detag(text,opentag='<',closetag='>'):
t1 = regex.escape(opentag)
t2 = regex.escape(closetag)
re = regex.compile(t1 + '(?:[^' + t2 + t1 + ']|(?R))*' + t2)
result = re.sub('',text)
return result
在熟悉 Python 3.4 的 re
模块时,我编写了一个函数,目的是删除 XML 标记。我想让它递归以供替代使用:
def detag(text,opentag='<',closetag='>'):
t1 = re.escape(opentag)
t2 = re.escape(closetag)
regex = t1 + '+.*?' + t2 + '+'
result = re.search(regex,text)
if result:
text=text[:result.start()] + text[result.end():]
text = detag(text,opentag,closetag)
return text
问题是函数没有很好地 'pair' 标签。例如:
>>> detag('a<b<c>d>e')
'ad>e'
我想要的输出是 "ae"(因为这些字母没有被 open/close 标签包围),但看起来外部打开标签与内部关闭标签匹配。我很好奇如何重写函数以从 detag('a<b<c>d>e')
获得所需的输出,并且仍然能够从多个内联和 nested/double 标签获得相同类型的输出:
>>> detag('a<b>c<d>e')
'ace'
>>> detag('a<<b>>c')
'ac'
>>> detag('a<b>c<<d>>e')
'ace'
以上示例目前正在按预期工作。重申一下,不应返回打开和关闭标记之间的任何内容。
如果您正在使用 regex package, this recursive pattern 可以工作:
<(?:[^><]|(?R))*>
在 (?R)
或 (?0)
时,模式从头开始粘贴。参见 test at regex101.com
由@noshelter添加:根据此信息,功能可以调整如下...
def detag(text,opentag='<',closetag='>'):
t1 = regex.escape(opentag)
t2 = regex.escape(closetag)
re = regex.compile(t1 + '(?:[^' + t2 + t1 + ']|(?R))*' + t2)
result = re.sub('',text)
return result