Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何替换正则表达式中的多个匹配项_Python_Regex - Fatal编程技术网

Python 如何替换正则表达式中的多个匹配项

Python 如何替换正则表达式中的多个匹配项,python,regex,Python,Regex,我正在尝试将以下字符串中的“=”替换为“=”: log="[x] = '1' and [y] <> '7' or [z]='51'". 输出应为: log="[x] == '1' and [y] <> '7' or [z]=='51'". log=“[x]=“1”和[y]“7”或[z]=“51”。 这是我得到的: log="[x] = '1' and [y] <> '7' or [z]=='51'". log=“[x]=“1”和[y]“7”或[z]=“

我正在尝试将以下字符串中的“=”替换为“=”:

log="[x] = '1' and [y] <> '7' or [z]='51'".
输出应为:

log="[x] == '1' and [y] <> '7' or [z]=='51'".
log=“[x]=“1”和[y]“7”或[z]=“51”。
这是我得到的:

log="[x] = '1' and [y] <> '7' or [z]=='51'".
log=“[x]=“1”和[y]“7”或[z]=“51”。
您可能正在寻找replace()函数:

log="[x] = '1' and [y] <> '7' or [z]='51'"
log = log.replace("=", "==") 
log=“[x]=“1”和[y]“7”或[z]=“51”
日志=日志。替换(“=”,“=”)
您可能正在寻找replace()函数:

log="[x] = '1' and [y] <> '7' or [z]='51'"
log = log.replace("=", "==") 
log=“[x]=“1”和[y]“7”或[z]=“51”
日志=日志。替换(“=”,“=”)
此部件经过匹配,不进行任何更换

只有当您离开循环时,才进行替换-这就是为什么它只更改最后一个循环的原因。;)


此外,不使用regex进行替换-simple
str.replace
获取所有匹配的子字符串并替换它们。因此,如果您的第一个
=
之前没有空间,它将被更改

查看您的正则表达式,在
]
=
之间只有一个空格,所以为什么不在这两种情况下进行替换,而不是使用正则表达式?;)

此部件经过匹配,不进行任何更换

只有当您离开循环时,才进行替换-这就是为什么它只更改最后一个循环的原因。;)


此外,不使用regex进行替换-simple
str.replace
获取所有匹配的子字符串并替换它们。因此,如果您的第一个
=
之前没有空间,它将被更改

查看您的正则表达式,在
]
=
之间只有一个空格,所以为什么不在这两种情况下进行替换,而不是使用正则表达式?;)


将您的函数更改为

def subs_equal_sign(logic):
    y = re.compile(r'\]\s?\=\s?')
    return y.sub("]==", logic)
现在输出将是

>>> subs_equal_sign('''log="[x] = '1' and [y] <> '7' or [z]='51'".''')
'log="[x]==\'1\' and [y] <> \'7\' or [z]==\'51\'".'
>>子等号(''log=“[x]='1'和[y]'7'或[z]='51'”)
'log=“[x]=\'1\'和[y]\'7\'或[z]=\'51\'”
正如所料


@h4z3正确地指出,您的关键问题是遍历匹配的组,而不对它们做任何操作。只需使用一次替换所有事件,即可使其正常工作。

将函数更改为

def subs_equal_sign(logic):
    y = re.compile(r'\]\s?\=\s?')
    return y.sub("]==", logic)
现在输出将是

>>> subs_equal_sign('''log="[x] = '1' and [y] <> '7' or [z]='51'".''')
'log="[x]==\'1\' and [y] <> \'7\' or [z]==\'51\'".'
>>子等号(''log=“[x]='1'和[y]'7'或[z]='51'”)
'log=“[x]=\'1\'和[y]\'7\'或[z]=\'51\'”
正如所料


@h4z3正确地指出,您的关键问题是遍历匹配的组,而不对它们做任何操作。只需使用一次替换所有出现的内容,即可使其正常工作。

处理此问题的快速方法是删除空白:

def subs_等号(逻辑):
对于范围内的k(len(逻辑)):
逻辑[k]。替换(“”,“”)
y=重新编译(r'\]\s?\=\s?)
迭代器=y.finditer(逻辑)
对于迭代器中的匹配:
j=str(match.group())
返回逻辑。替换(j']=')
字符串是否表示REDCap变量的分支逻辑?如果是这样的话,我不久前编写了一个函数,可以将REDCap类似SQL的语法转换为Python形式。这是:

def make_pythonic(str):
"""
获取字段名的分支逻辑字符串
并将语法转换为Python的语法。
"""
#列出分支逻辑字符串中的所有复选框变量
#注意:列表中的项目具有相同的序列化(排序)
#就像在绳子上一样。
复选框\u snoop=re.findall(“[a-z0-9\]*\([0-9]*\”,str)
#如果复选框\u snoop中有条目
如果len(复选框\u snoop)>0:
#串行替换每个的“[mycheckboxvar(888)]”语法
#逻辑字符串中带有适当值的复选框var
#“记录['mycheckboxvar__888']”语法
对于复选框\u snoop中的项目:
item=re.sub('\'),'',item)
item=re.sub(“\(”,“\”,item)
str=re.sub(“[a-z0-9\]*\([0-9]*\”),项目,str)
#面具与替代品
str=re.sub('=','X11X',str)
str=re.sub('=','=',str)
str=re.sub('Z11Z','=',str)
str=re.sub(“”,!=“”,str)
str=re.sub('\[','记录[\'',str)
str=re.sub('\]','\']',str)
#返回字符串
返回str

处理此问题的快速方法是删除空白:

def subs_等号(逻辑):
对于范围内的k(len(逻辑)):
逻辑[k]。替换(“”,“”)
y=重新编译(r'\]\s?\=\s?)
迭代器=y.finditer(逻辑)
对于迭代器中的匹配:
j=str(match.group())
返回逻辑。替换(j']=')
字符串是否表示REDCap变量的分支逻辑?如果是这样的话,我不久前编写了一个函数,可以将REDCap类似SQL的语法转换为Python形式。这是:

def make_pythonic(str):
"""
获取字段名的分支逻辑字符串
并将语法转换为Python的语法。
"""
#列出分支逻辑字符串中的所有复选框变量
#注意:列表中的项目具有相同的序列化(排序)
#就像在绳子上一样。
复选框\u snoop=re.findall(“[a-z0-9\]*\([0-9]*\”,str)
#如果复选框\u snoop中有条目
如果len(复选框\u snoop)>0:
#串行替换每个的“[mycheckboxvar(888)]”语法
#逻辑字符串中带有适当值的复选框var
#“记录['mycheckboxvar__888']”语法
对于复选框\u snoop中的项目:
item=re.sub('\'),'',item)
item=re.sub(“\(”,“\”,item)
str=re.sub(“[a-z0-9\]*\([0-9]*\”),项目,str)
#面具与替代品
str=re.sub('=','X11X',str)
str=re.sub('=','=',str)
str=re.sub('Z11Z','=',str)
str=re.sub(“”,!=“”,str)
str=re.sub('\[','记录[\'',str)
str=re.sub('\]','\']',str)
#返回字符串
返回str

这可以用整个字符串中要替换的新字符替换给定字符。 log=log.replace(“=”,“=”)替换gi