Python re.sub repl w / functions,bug还是正确的行为?

时间:2014-09-30 21:08:06

标签: python

众所周知,re.sub中的 repl 可以接受一个函数。下面的第一个代码段会调用帐户功能,但会使用相同的帐号替换所有匹配项。第二个代码片段产生预期的行为。

这是re.sub的意思吗?为什么第一个代码段失败了?

First Snippet

def accountNumberGen():
    acc_id_gen= lambda: (random.randint(1000000000000,9999999999999))
    acc_val = str(acc_id_gen())
    return acc_val

def changeFiles():
    for filename in os.listdir(file_dir):
        for line in fileinput.input(file_dir + '\\' + filename, inplace=True):
            search = re.search('\d{13}', line)
            line = re.sub('\d{13}', accountNumberGen(), line)
            sys.stdout.write(line)

第二个片段

def accountNumberGen(something):
    acc_id_gen= lambda: (random.randint(1000000000000,9999999999999))
    acc_val = str(acc_id_gen())
    return acc_val

def changeFiles():
    for filename in os.listdir(file_dir):
        for line in fileinput.input(file_dir + '\\' + filename, inplace=True):
            search = re.search('\d{13}', line)
            line = re.sub('\d{13}', accountNumberGen, line)
            sys.stdout.write(line)  

2 个答案:

答案 0 :(得分:3)

accountNumberGen()没有命名函数;它调用函数accountNumberGen,并且此调用的返回值(字符串)用作re.sub的“repl”参数。要将函数作为参数传递,您只需编写函数的名称(accountNumberGen),这就是第二个代码段的工作原理。

答案 1 :(得分:0)

如果每行只进行一次替换,则两种方法都会给出正确的输出。但是,如果

,它会有所不同
  1. 该函数作为参数提供给re.sub()

  2. 提供了从函数返回的值

  3. ...如果每行都有多个替换。使用提供的功能,每次替换都会调用一次,但是使用提供的函数的值,每次都使用相同的值。

    这是SSCCE

    import re,random,sys
    
    def accountNumberGen1():
        acc_id_gen= lambda: (random.randint(100,999))
        acc_val = str(acc_id_gen())
        return acc_val
    
    def accountNumberGen(something):
        return accountNumberGen1()
    
    acct = ['000 009 a','001 008 b','002 007 c','003 006 d']
    
    for line in acct:
        line = re.sub('\d{3}', accountNumberGen1(), line)
        sys.stdout.write(line+"\n")
    
    sys.stdout.write ("\n")
    
    for line in acct:
        line = re.sub('\d{3}', accountNumberGen, line)
        sys.stdout.write(line+"\n")
    

    ...产生输出:

    943 943 a
    234 234 b
    802 802 c
    974 974 d
    
    429 753 a
    189 459 b
    225 863 c
    178 114 d
    

    ...每次将函数传递给re.sub()时都会替换不同的随机值。