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

Dea*_*nes 4 python regex

在Python中使用正则表达式,我试图删除字符串中的所有XML类型元素,除了那些包含QUOTE的元素,例如<QUOTE>,</QUOTE>或者<QUOTE A="B">应该保留,但是其他的例如<EXAMPLE><TEST A="B">应该被删除.我已经创建了这个,它取代了所有元素但却无法解决这个问题:

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

任何人的想法?

Tom*_*ych 5

我相信负面的先行断言会做你想要的:

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))
Run Code Online (Sandbox Code Playgroud)

编辑:它是如何工作的

正如名称所示,Lookahead断言在匹配的字符串中"向前看",但不消耗它们匹配的字符.你可以做正((?=...))和负((?!...))前瞻.(也存在积极和消极的外观断言.)

因此,显示的正则表达式匹配<标记的开头,然后在it()和它后面的单词边界()之前QUOTE使用可选项/进行负向前瞻.如果匹配,则正则表达式不匹配,并忽略该标记.如果它不匹配,正则表达式会继续吃一个或多个非字符,然后关闭.我想你可能想让它吃掉标签后面的任何空格 - 我没有这样做./?\b>>