正则表达式有任何限制吗?

时间:2015-12-13 07:56:39

标签: regex

我发现我无法替换子字符串中的某些字符:

像这样,我想删除双引号子串中的'a'

origin = 'a hello "a world a" any other text'

是否有正则表达式可以解决这个问题,或者使用正则表达式时有一些限制?

2 个答案:

答案 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)

demo

在回溯控制动词的帮助下,可以缩短此模式,以跳过引用的部分或引用部分的结尾,而不会出现孤立的“a”:

regex.compile(r'''
    (?: \G(?!\A) | " )

    [^"a]*(?:(?:\Ba|a\B)[^"a]*)*

    (?: "[^"]*(*SKIP)(*F))?
    \K a
''', regex.VERBOSE)

demo

答案 1 :(得分:0)

我不确定您使用的语言是什么,但对于Perl,您会:

$origin =~ s|a hello "a world a" any other text|A|g;

关键是g的结尾是全局的,它将处理字符串中的所有替换。没有g它会在第一个之后停止。