我正在尝试将以下字符串中的'='替换为'==':
log="[x] = '1' and [y] <> '7' or [z]='51'".
不幸的是,只有第二个'='被替换了。为什么不替换第一个,我又该如何替换?
def subs_equal_sign(logic):
y = re.compile(r'\]\s?\=\s?')
iterator = y.finditer(logic)
for match in iterator:
j = str(match.group())
return logic.replace(j, ']==')
输出应为:
log="[x] == '1' and [y] <> '7' or [z]=='51'".
这是我得到的:
log="[x] = '1' and [y] <> '7' or [z]=='51'".
答案 0 :(得分:2)
for match in iterator:
j = str(match.group())
return logic.replace(j, ']==')
这部分经过比赛,没有任何替换。
仅当您退出循环时,才进行替换-这就是为什么它仅更改最后一个的原因。 ;)
此外,您无需使用正则表达式就可以进行替换-简单的str.replace
将所有子字符串匹配项都替换掉。因此,如果您的第一个=
之前没有空间,那么它还是会被更改!
看看您的正则表达式,]
和=
之间只能有一个空格,那么为什么不对这两种情况进行替换而不使用正则表达式呢? ;)
def subs_equal_sign(logic):
return logic.replace(']=', ']==').replace('] =', ']==')
答案 1 :(得分:0)
也许您正在寻找replace()函数:
log="[x] = '1' and [y] <> '7' or [z]='51'"
log = log.replace("=", "==")
答案 2 :(得分:0)
将功能更改为
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\'".'
符合预期。
@ h4z3正确指出,您的关键问题是遍历匹配的组而不对它们进行任何操作。您只需使用re.sub()
一次替换所有匹配项即可使其工作。
答案 3 :(得分:0)
解决此问题的一种快速方法是删除空格:
def subs_equal_sign(logic):
for k in range(len(logic))):
logic[k].replace(' ','')
y = re.compile(r'\]\s?\=\s?')
iterator = y.finditer(logic)
for match in iterator:
j = str(match.group())
return logic.replace(j, ']==')
该字符串是否表示REDCap变量的分支逻辑?如果是这样,我不久前写了一个函数,该函数应该将REDCap的类似SQL的语法转换为pythonic形式。在这里:
def make_pythonic(str):
"""
Takes the branching logic string of a field name
and converts the syntax to that of Python.
"""
# make list of all checkbox vars in branching_logic string
# NOTE: items in list have the same serialization (ordering)
# as in the string.
checkbox_snoop = re.findall('[a-z0-9_]*\([0-9]*\)', str)
# if there are entries in checkbox_snoop
if len(checkbox_snoop) > 0:
# serially replace "[mycheckboxvar(888)]" syntax of each
# checkbox var in the logic string with the appropraite
# "record['mycheckboxvar___888']" syntax
for item in checkbox_snoop:
item = re.sub('\)', '', item)
item = re.sub('\(', '___', item)
str = re.sub('[a-z0-9_]*\([0-9]*\)', item, str)
# mask and substitute
str = re.sub('<=', 'Z11Z', str)
str = re.sub('>=', 'X11X', str)
str = re.sub('=', '==', str)
str = re.sub('Z11Z', '<=', str)
str = re.sub('X11X', '>=', str)
str = re.sub('<>', '!=', str)
str = re.sub('\[', 'record[\'', str)
str = re.sub('\]', '\']', str)
# return the string
return str
答案 4 :(得分:0)
这可以将给定字符替换为要在整个字符串中替换的新字符。 log = log.replace(“ =”,“ ==”)#用新的字符串替换给定的子字符串 打印(日志)#显示