python - 在 Python 中使用正则表达式替换除特定元素之外的所有元素

标签 python regex

在 Python 中使用正则表达式,我试图删除字符串中的所有 XML 类型元素,但包含 QUOTE 的元素除外,例如 <QUOTE> , </QUOTE><QUOTE A="B">应该保留,但其他如 <EXAMPLE><TEST A="B">应该被删除。我创建了这个,它替换了所有元素但无法计算出非部分:

re.sub(r'</?[\w= \-"]+>', '', s)

有什么想法吗?

最佳答案

我相信否定的前瞻断言会做你想做的事:

import re

regex = r'<(?!/?QUOTE\b)[^>]+>'

tests = [
    'a plain old string',
    'a string with <SOME> <XML TAGS="stuff">',
    'a string with <QUOTE>, </QUOTE>, and <QUOTE with="data">',
    'a string that has <QUOTEA> tags </QUOTEB>',
]

for i in tests:
    result = re.sub(regex, '', i)
    print('{}\n{}\n'.format(i, result))

编辑:它是如何工作的

前瞻断言,顾名思义,在匹配的字符串中“向前看”,但不消耗它们匹配的字符。您可以进行正面 ((?=...)) 和负面 ((?!...)) 前瞻。 (也有正面和负面的回顾断言。)

因此,显示的正则表达式匹配 <对于标记的开头,然后对 QUOTE 进行否定前瞻带有可选的 /在它之前 ( /? ) 和它后面的单词边界 ( \b )。如果匹配,则正则表达式不匹配,该标记将被忽略。如果不匹配,则正则表达式继续吃一个或多个非 >字符和结尾> .我猜你可能想让它也吃掉标签后面的任何空格——我没有那样做。

关于python - 在 Python 中使用正则表达式替换除特定元素之外的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5423811/

相关文章:

python - 如果不解包,如何以最通用的形式输入提示参数和 kwargs?

python - 如何在 Python 3 中一次迭代两个列表?

regex - 如何在ksh中grep带有点的字符串的精确匹配

java - 如何从正则表达式中的模式匹配中排除某些字符?

c# - 正则表达式数据注释不允许开始/结束空格(类似于修剪)

Javascript new RegExp vs./pattern/和多行

python - 如何将对象传递给单元测试类

python - django:如何在 Trunc 之后用外键反向计数来注释查询集?

Java正则表达式从日志文件中获取子度量

python - 如何使用pandas中的DataFrame在图表中的x轴上显示日期