众所周知,re.sub中的 repl 可以接受一个函数。下面的第一个代码段会调用帐户功能,但会使用相同的帐号替换所有匹配项。第二个代码片段产生预期的行为。
这是re.sub的意思吗?为什么第一个代码段失败了?
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)
答案 0 :(得分:3)
accountNumberGen()
没有命名函数;它调用函数accountNumberGen
,并且此调用的返回值(字符串)用作re.sub
的“repl”参数。要将函数作为参数传递,您只需编写函数的名称(accountNumberGen
),这就是第二个代码段的工作原理。
答案 1 :(得分:0)
如果每行只进行一次替换,则两种方法都会给出正确的输出。但是,如果
,它会有所不同该函数作为参数提供给re.sub()
或
提供了从函数返回的值
...如果每行都有多个替换。使用提供的功能,每次替换都会调用一次,但是使用提供的函数的值,每次都使用相同的值。
这是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()
时都会替换不同的随机值。