python - 使用正则表达式取消标记不会捕获嵌套标签

标签 python regex python-3.x python-3.4

熟悉 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

问题是该函数没有很好地“配对”标签。例如:

>>> detag('a<b<c>d>e')
'ad>e'

我想要的输出是“ae”(因为这些字母没有被打开/关闭标签包围),但似乎外部打开标签与内部关闭标签匹配。我很好奇如何重写该函数以从 detag('a<b<c>d>e') 获得所需的输出,并且仍然能够从多个内联和嵌套/双标记获得相同类型的输出:

>>> detag('a<b>c<d>e')
'ace'
>>> detag('a<<b>>c')
'ac'
>>> detag('a<b>c<<d>>e')
'ace'

上述示例目前正在按预期工作。重申一下,不应返回打开标记和关闭标记之间的任何内容。

最佳答案

如果您使用regex package ,这个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 - 使用正则表达式取消标记不会捕获嵌套标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28417585/

相关文章:

python - 如何将 postgresql 字段名称输出到字典中,而不是仅在 python 中输出列名称?

python - concat + groupby + 应用在 panda dataframe 的多列中

python - 我怎么能在 recarray 中做过滤器

python - 使用 Python 通过互联网访问网络摄像头

python - 将一本书解析成章节——Python

javascript - 仅屏蔽 9 位数字

用于匹配字符或行 anchor 的正则表达式

Python Pandas SUMPRODUCT 和 L 矩阵计算

python - PyQuery 如何将一个元素追加和重命名到它的每个子元素中

python - Pandas DataFrame 自动将错误值作为索引