正则表达式可删除成对的字符串,但不会删除多对字符串时的所有内容

时间:2018-09-10 18:34:18

标签: python regex

是否存在可以使用此字符串的正则表达式:

"This is [D>aa <D] a [A>bb <A] test [D>ccc  cc <D]."

并返回:

"This is a [A>bb <A] test."

因此实际上删除了所有以[D>开头和以<D]结尾的内容。这不可能很直接,因为这些对会多次弹出,因此使用正则表达式[[D>].*[<D]]返回:

"This is ."

3 个答案:

答案 0 :(得分:0)

默认情况下,.*量词是贪婪的。这意味着它会尽可能多地匹配0个或多个字符,因此您的第一个匹配一直延伸到第二个匹配的结尾。通过将其更改为.*?可以使其变得很懒惰,它将尽可能少地匹配0个或多个字符。这是模式:

\[D>.*?<D\]

Demo

答案 1 :(得分:0)

这应该可以解决问题;请注意,惰性量词.*?可以避免贪婪地消耗结尾的<D]。我在方括号之前添加了一个可选空格以清理输出:

import re

s = "This is [D>aa <D] a [A>bb <A] test [D>ccc  cc <D]."

print(re.sub(r"( ?\[D>.*?<D\])", "", s))

输出:

This is a [A>bb <A] test.

Repl

答案 2 :(得分:0)

如果两对始终以[D>开头并且总是与<D]匹配,则可以匹配一个空格,然后匹配[D>,然后使用否定的字符类匹配不匹配的方括号[^]]+,并在末尾匹配一个方括号。

然后使用sub并替换为空字符串

[ ]\[D>[^]]+\]

Regex demo

import re
s = "This is [D>aa <D] a [A>bb <A] test [D>ccc  cc <D]."
print(re.sub(r"[ ]\[D[^]]+\]", "", s)) # This is a [A>bb <A] test.

Demo

相关问题