用正则表达式去标记不会捕获嵌套的标记

2024-05-12 14:36:37 发布

您现在位置:Python中文网/ 问答频道 /正文

为了熟悉python3.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”(因为这些字母没有被open/close标签包围),但是看起来外部open标签和内部close标签是匹配的。我很好奇如何重写函数以从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'

上述例子目前正如期发挥作用。重申一下,open和close标记之间的任何内容都不应返回。你知道吗


Tags: 函数text标记reclose标签resultopen
1条回答
网友
1楼 · 发布于 2024-05-12 14:36:37

如果您使用的是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

相关问题 更多 >