使用re.sub?列表中的元素替换?

时间:2012-02-26 17:51:41

标签: python regex

在列表中使用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'

3 个答案:

答案 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)

Here's a demo.

答案 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