在Python中使用正则表达式替换特定元素以外的所有内容
在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
)。如果匹配到了,这个正则表达式就不会匹配,那个标签就会被忽略。如果没有匹配到,正则表达式就会继续匹配一个或多个不是>
的字符,然后匹配结束的>
。我想你可能还想让它匹配标签后面的空格,但我没有这样做。