首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >regex不捕获嵌套标记。

regex不捕获嵌套标记。
EN

Stack Overflow用户
提问于 2015-02-09 19:20:34
回答 1查看 83关注 0票数 1

在熟悉Python3.4的re模块时,我编写了一个函数,目的是删除XML。我想使它成为递归的,以供交替使用:

代码语言:javascript
复制
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

问题是函数不能很好地“配对”标记。例如:

代码语言:javascript
复制
>>> detag('a<b<c>d>e')
'ad>e'

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

代码语言:javascript
复制
>>> detag('a<b>c<d>e')
'ace'
>>> detag('a<<b>>c')
'ac'
>>> detag('a<b>c<<d>>e')
'ace'

上述例子目前正如期而至。需要重申的是,打开标记和结束标记之间的任何内容都不应该返回。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-09 20:40:16

如果您使用的是regex软件包,这个递归模式可以工作:

代码语言:javascript
复制
<(?:[^><]|(?R))*>

(?R)(?0)中,模式从一开始就被粘贴。请参阅在regex101.com进行测试

由@noshelter添加:根据这些信息,该函数可以调整如下.

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28417585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档