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

时间:2019-08-01 12:52:29

标签: python regex

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

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'".

5 个答案:

答案 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(“ =”,“ ==”)#用新的字符串替换给定的子字符串     打印(日志)#显示