Python正则表达式替换字符串(如果不被单引号包围)

Python正则表达式替换字符串(如果不被单引号包围),python,regex,Python,Regex,我正在尝试编写一个正则表达式来替换字符串,如果不是用单引号括起来的话。 例如,我想用以下字符串中的XXX替换FOO: string = "' FOO ' abc 123 ' def FOO ghi 345 ' FOO '' FOO ' lmno 678 FOO '" 所需输出为: output = "' FOO ' abc 123 ' def FOO ghi 345 ' XXX '' XXX ' lmno 678 FOO '" 我现在的正则表达式是: myregex = re.compile

我正在尝试编写一个正则表达式来替换字符串,如果不是用单引号括起来的话。 例如,我想用以下字符串中的XXX替换FOO:

string = "' FOO ' abc 123 ' def FOO ghi 345 ' FOO '' FOO ' lmno 678 FOO '"
所需输出为:

output = "' FOO ' abc 123 ' def FOO ghi 345 ' XXX '' XXX ' lmno 678 FOO '"
我现在的正则表达式是:

myregex = re.compile("(?<!')+( FOO )(?!')+", re.IGNORECASE)

myregex=re.compile((?如果没有可变长度查找,这是很难做到的。我不确定python regex是否支持它。总之,一个简单的解决方案是:

使用此正则表达式:
(?:[^'\s]\s*)(FOO)(?:\s*[^'\s])

第一个捕获组应返回正确的结果


如果这始终是一个引号,后面只有一个空格,如您的示例中所示,您可以使用固定长度的lookback:
(?以下是它的实现方式:

import re

def replace_FOO(m):
    if m.group(1) is None:
        return m.group()

    return m.group().replace("FOO", "XXX")

string = "' FOO ' abc 123 ' def FOO ghi 345 ' FOO '' FOO ' lmno 678 FOO '"

output = re.sub(r"'[^']*'|([^']*)", replace_FOO, string)

print(string)
print(output)
[编辑]

re.sub
函数将接受字符串模板或函数作为替换项。如果替换项是函数,则每次找到匹配项时都会调用函数,传递匹配对象,然后使用返回值(必须是字符串)作为替换字符串

至于模式本身,当它搜索时,如果当前位置有一个
'
,它将匹配并包括下一个
'
,否则它将匹配但不包括下一个
'
或字符串的结尾

替换函数将在每次匹配时调用,并返回相应的结果

实际上,现在我想起来了,我根本不需要使用组。我可以这样做:

def replace_FOO(m):
    if m.group().startswith("'"):
        return m.group().replace("FOO", "XXX")

    return m.group()

string = "' FOO ' abc 123 ' def FOO ghi 345 ' FOO '' FOO ' lmno 678 FOO '"

output = re.sub(r"'[^']*'|[^']+", replace_FOO, string)

我认为你的例子是错误的。为什么第一个“abc 123”没有被XXX替换?在我看来,这个例子是正确的,第一个FOO被单引号包围,必须跳过。在第一个FOO上与你达成一致。但是,这不意味着开始abc的位是/outside/?如果是,结果应该是:‘FOO’XXX‘def FOO ghi 345’XXX‘XXX’lmno 678 FOO’。对吗?这个例子对我来说似乎也不正确。不,只有文字“FOO”(前后各有一个空格)应该替换为“XXX”“:PPython的标准正则表达式库're'不支持可变长度lookbehinds,但PyPI上有一个替代正则表达式库,它在。对我不起作用,我得到
'FOO''def FOO ghi 345'''''lmno 678 FOO'
作为输出(“XXX”消失了),它按我的预期工作(Python 2.7.1)非常感谢!如果你能解释一下代码,那将非常有用,因为我是Python和regex的新手:P