在Python中使用正则表达式,我试图删除字符串中的所有XML类型元素,除了那些包含QUOTE的元素,例如<QUOTE>,</QUOTE>或者<QUOTE A="B">应该保留,但是其他的例如<EXAMPLE>或<TEST A="B">应该被删除.我已经创建了这个,它取代了所有元素但却无法解决这个问题:
re.sub(r'</?[\w= \-"]+>', '', s)
Run Code Online (Sandbox Code Playgroud)
任何人的想法?
我相信负面的先行断言会做你想要的:
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>>