在Python中使用正则表达式,我试图删除字符串中的所有XML类型元素,除了那些包含QUOTE的元素,例如<QUOTE>
,</QUOTE>
或<QUOTE A="B">
应该保留,但是应删除<EXAMPLE>
或<TEST A="B">
等其他内容。我已经创建了这个,它取代了所有元素但却无法解决这个问题:
re.sub(r'</?[\w= \-"]+>', '', s)
任何想法?
答案 0 :(得分: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))
编辑:如何运作
Lookahead断言,顾名思义,在匹配的字符串中“向前看”,但不消耗它们匹配的字符。您可以做正面((?=...)
)和负面((?!...)
)前瞻。 (还有正面和负面的看法断言。)
因此,显示的正则表达式与<
匹配标记的开头,然后对QUOTE
进行负前瞻,前面带有可选的/
(/?
)并且它背后的单词边界(\b
)。如果匹配,则正则表达式不匹配,并忽略该标记。如果它不匹配,正则表达式继续吃一个或多个非>
个字符,以及结束>
。我想你可能想让它吃掉标签后面的任何空格 - 我没有这样做。
答案 1 :(得分: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)))
答案 2 :(得分:0)
这是一个潜在的单线。
re.sub(r'<[/]?[^Q][^U][^O][^T][^E][^>]*>', '', s)
[/]?应该匹配/,当它存在时。
[^&GT;] * GT;匹配标签内的所有其他内容,并使标签更接近。
如果您不希望其他标签以Q开头,您可以进一步缩短它:
re.sub(r'<[/]?[^Q][^>]*>', '', s)