繁体   English   中英

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

[英]Replacing all but specific elements using regex in Python

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

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

任何人的想法?

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

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 )。 如果匹配,则正则表达式不匹配,并忽略该标记。 如果它不匹配,正则表达式继续吃一个或多个非>字符,结束> 我想你可能想让它吃掉标签后面的任何空格 - 我没有这样做。

我首先用一些未出现在文本中的奇怪符号替换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)))

rmalouf的方法应该有效。

这是一个潜在的单线。

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

[/]? 应该匹配/,当它存在时。

[^>] *>匹配标签内的所有其他内容,标签更接近。

如果您不希望其他标签以Q开头,您可以进一步缩短它:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM