我发现我无法替换子字符串中的某些字符:
像这样,我想删除双引号子串中的'a'origin = 'a hello "a world a" any other text'
是否有正则表达式可以解决这个问题,或者使用正则表达式时有一些限制?
答案 0 :(得分:1)
一个简短的方法是更换所有引用的部分,并在这些部分中使用另一个替代的最终隔离的“a”:
re.sub(r'"[^"]*"', lambda x: re.sub(r'\ba\b', 'X', x.group(0)), s)
IMO,这是更简单的方式。
如果您只想使用一个替换项,则需要使用正则表达式模块和基于锚\G
的更复杂模式,以确保引号之间匹配的连续性:
import regex
p = regex.compile(r'''
(?:
\G(?!\A)
|
(?:\A|") # from the start of the string or from the closing quote
[^"]*+ # all characters that are not a quote
# skip quoted parts without an isolated "a" and reach the next opening quote
(?: " [^"a]*(?:(?:\Ba|a\B)[^"a]*)* " [^"]*)*+
" # the opening quote
)
[^"a]*+(?:(?:\Ba|a\B)[^"a]*)*+ # all characters before an "a"
\Ka''', regex.VERBOSE)
result = p.sub('X', s)
在回溯控制动词的帮助下,可以缩短此模式,以跳过引用的部分或引用部分的结尾,而不会出现孤立的“a”:
regex.compile(r'''
(?: \G(?!\A) | " )
[^"a]*(?:(?:\Ba|a\B)[^"a]*)*
(?: "[^"]*(*SKIP)(*F))?
\K a
''', regex.VERBOSE)
答案 1 :(得分:0)
我不确定您使用的语言是什么,但对于Perl,您会:
$origin =~ s|a hello "a world a" any other text|A|g;
关键是g的结尾是全局的,它将处理字符串中的所有替换。没有g它会在第一个之后停止。