Python re.sub repl w/函数、错误或正确行为?

Python re.sub repl w/函数、错误或正确行为?,python,Python,众所周知,re.sub中的repl可以接受函数。下面的第一个代码段调用account函数,但用相同的帐号替换所有匹配项。第二个代码段生成预期的行为 re.sub就是这样工作的吗?为什么第一个代码段失败了 第一段 第二段 accountNumberGen()不命名函数;它调用函数accountNumberGen,此调用的返回值(一个字符串)用作re.sub的“repl”参数。要将函数作为参数传递,只需编写函数名(accountNumberGen),这就是第二个代码段工作的原因。如果每行只需进行一次

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

re.sub就是这样工作的吗?为什么第一个代码段失败了

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

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

  • 该函数作为参数提供给
    re.sub()

  • 提供从函数返回的值

  • 。。。如果每一行有多个替换。如果提供了函数,则每次替换都会调用一次,但如果提供了函数的值,则每次使用相同的值

    这是一个:

    。。。它产生输出:

    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()

    “它是已知的…”时,都会替换不同的随机值,因此即使Dothraki现在也在使用Python:)
    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)  
    
    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