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

4 投票
3 回答
3176 浏览
提问于 2025-04-16 14:21

在Python中使用正则表达式,我想从一个字符串中去掉所有类似XML的元素,但保留那些包含QUOTE的元素,比如<QUOTE></QUOTE>或者<QUOTE A="B">这些要保留,而像<EXAMPLE>或者<TEST A="B">这样的则要去掉。我已经写了一段代码,可以替换掉所有元素,但我不知道怎么处理不需要的部分:

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

有没有人有什么好主意?

3 个回答

0

rmalouf的方法应该是可行的。

这里有一个可能的单行代码。

re.sub(r'<[/]?[^Q][^U][^O][^T][^E][^>]*>', '', s)

[/]? 这个部分会匹配到斜杠(/),如果它存在的话。

[^>]*> 会匹配标签内部的所有内容,以及标签的结束部分。



如果你不希望有其他以Q开头的标签,你可以进一步简化代码:

re.sub(r'<[/]?[^Q][^>]*>', '', s)
1

我会先把QUOTE替换成一个文本中没有的奇怪符号,比如说^:

s = re.sub(r'(</?)QUOTE','\1^',s)

然后去掉那些不包含你那个奇怪符号的XML标签:

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

接着再把QUOTE放回去:

s = re.sub(r'(</?)\^','\1QUOTE',s)

编辑:你也可以把这些步骤合并成一行来做:

s = re.sub(r'(</?)\^','\1QUOTE',re.sub(r'</?[\w= \-"]+>','',re.sub(r'(</?)QUOTE','\1^',s)))
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))

编辑:它是如何工作的

前瞻断言,顾名思义,就是在匹配的字符串中“向前看”,但不会消耗它们所匹配的字符。你可以使用正向前瞻((?=...))和负向前瞻((?!...))。(还有正向和负向的后瞻断言。)

所以,显示的正则表达式会匹配标签的开始部分<,然后进行一个负向前瞻,检查后面是否有QUOTE,并且在它前面可以有一个可选的//?),后面要有一个单词边界(\b)。如果匹配到了,这个正则表达式就不会匹配,那个标签就会被忽略。如果没有匹配到,正则表达式就会继续匹配一个或多个不是>的字符,然后匹配结束的>。我想你可能还想让它匹配标签后面的空格,但我没有这样做。

撰写回答