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