在列表中使用re.sub
执行替换的最佳方法是什么?例如:
import re
some_text = 'xxxxxxx@yyyyyyyyy@zzzzzzzzz@'
substitutions = ['ONE', 'TWO', 'THREE']
x = re.sub('@', lambda i: i[0] substitutions.pop(0), some_text) # this doesn't actually work
所需的输出是:
some_text = 'xxxxxxxONEyyyyyyyyyTWOzzzzzzzzzTHREE'
答案 0 :(得分:5)
你的lambda中只有语法错误:
>>> substitutions = ['ONE', 'TWO', 'THREE']
>>> re.sub('@', lambda _: substitutions.pop(0), some_text)
'xxxxxxxONEyyyyyyyyyTWOzzzzzzzzzTHREE'
如果您不想修改列表,可以将其包装为可迭代的。
>>> substitutions = ['ONE', 'TWO', 'THREE']
>>> subs = iter(substitutions)
>>> re.sub('@', lambda _: next(subs), some_text)
'xxxxxxxONEyyyyyyyyyTWOzzzzzzzzzTHREE'
答案 1 :(得分:1)
一种方式(可能是更好的方法,我真的不知道Python)是编译正则表达式,然后使用sub
代替:
import re
some_text = 'xxxxxxx@yyyyyyyyy@zzzzzzzzz@'
substitutions = ['ONE', 'TWO', 'THREE']
pattern = re.compile('@')
x = pattern.sub(lambda i: substitutions.pop(0), some_text)
答案 2 :(得分:1)
代码几乎正确,需要稍微纠正语法错误:
import re
some_text = 'xxxxxxx@yyyyyyyyy@zzzzzzzzz@'
substitutions = ['ONE', 'TWO', 'THREE']
x = re.sub('@', lambda i: substitutions.pop(0), some_text) # the error was in the lambda function