Php 在Python中替换字符串时,可以传递字典吗?
在PHP中,您有Php 在Python中替换字符串时,可以传递字典吗?,php,python,regex,string,Php,Python,Regex,String,在PHP中,您有preg_replace($patterns,$replacements,$string),在这里,您可以通过传入一个模式和替换数组,一次完成所有替换 Python中的等价物是什么 我注意到字符串和re函数replace()和sub()不使用字典 根据rick的评论进行编辑以澄清: 其思想是使用一个dict,其中的键作为正则表达式模式,例如'\d+S',以及(希望)常量字符串值(希望没有反向引用)。现在相应地编辑我的答案(即回答实际问题)。最接近的可能是: somere.sub(
preg_replace($patterns,$replacements,$string)
,在这里,您可以通过传入一个模式和替换数组,一次完成所有替换
Python中的等价物是什么
我注意到字符串和re函数replace()
和sub()
不使用字典
根据rick的评论进行编辑以澄清:
其思想是使用一个dict,其中的键作为正则表达式模式,例如'\d+S'
,以及(希望)常量字符串值(希望没有反向引用)。现在相应地编辑我的答案(即回答实际问题)。最接近的可能是:
somere.sub(lambda m: replacements[m.group()], text)
例如:
>>> za = re.compile('z\w')
>>> za.sub(lambda m: dict(za='BLU', zo='BLA')[m.group()], 'fa za zo bu')
'fa BLU BLA bu'
如果要为替换中缺少的匹配项提供默认值,请使用.get
而不是[]
-索引
编辑:rick真正想要的是一个dict,其中的键作为正则表达式模式,例如'\d+S'
,以及(希望)常量字符串值(希望没有反向引用)。烹饪书配方可用于此目的:
def dict_sub(d, text):
""" Replace in 'text' non-overlapping occurences of REs whose patterns are keys
in dictionary 'd' by corresponding values (which must be constant strings: may
have named backreferences but not numeric ones). The keys must not contain
anonymous matching-groups.
Returns the new string."""
# Create a regular expression from the dictionary keys
regex = re.compile("|".join("(%s)" % k for k in d))
# Facilitate lookup from group number to value
lookup = dict((i+1, v) for i, v in enumerate(d.itervalues()))
# For each match, find which group matched and expand its value
return regex.sub(lambda mo: mo.expand(lookup[mo.lastindex]), text)
示例用法:
d={'\d+S': 'wot', '\d+T': 'zap'}
t='And 23S, and 45T, and 66T but always 029S!'
print dict_sub(d, t)
发射:
And wot, and zap, and zap but always wot!
您可以避免构建
lookup
,而只使用mo.expand(d.values()[mo.lastindex-1])
,但如果d
非常大,并且有许多匹配项(抱歉,没有精确测量/基准测试这两种方法,所以这只是一个猜测;-),那么这可能会有点慢。这样做很容易:
replacements = dict(hello='goodbye', good='bad')
s = "hello, good morning";
for old, new in replacements.items():
s = s.replace(old, new)
您会发现许多地方PHP函数接受一个值数组,并且没有直接的Python等价物,但是在Python中使用数组(列表)要容易得多,所以问题不大
mynewstring=reduce(lambda a,(b,c): a.replace(b, c), mydict.items(), mystring)
在python中替换字符串时可以传递字典。 考虑上面的例子:
replacement = {'hello' : 'goodbye', 'good' : 'bad' }
您已经用这种格式编写了字符串
s = "%(hello)s, %(good)s morning"
changed_s = s%replacement
更改的_的输出将为
"goodbye, bad morning"
这只支持一个正则表达式,我想你不能比我从ActiveState获取的函数更简单,以防你真的需要一个替换和一个模式dict。你可以吗?为了在一个过程中执行多个字符串替换,我喜欢这个配方,这就是为什么我选择它作为Python食谱的原因,请参阅(我认为安娜和我在那里补充的讨论确实增加了一些价值,但我当然有偏见)。我试图更直接地回答所问的确切问题——一个完全通用的RE和给定的替换目录。我认为原始问题最好由配方来回答,因为PHP的preg_replace同时接受许多正则表达式和替换。配方不接受任何RE——它根据dict构建一个;一个完全不同的TAk、 让我看看preg_replace precision,看看如何重写那个确切的规范……我知道我是一个很好的读心术的人……:)我删除了我的答案,以避免进一步的混淆。我将只在这里保留recipe链接,它将替换使用常规字符串而不是regexp。您可能希望使用dict.iteritems而不是dict.items,因为您不喜欢它。dict.items()不保证按任何特定顺序排列,因此产生的替换是不可预测的。例如,在您的示例中,如果首先处理“hello”,则结果字符串为“badbay,bad morning”;如果mydict是
{'a':'b','b':'a'}
@Eric,这是我们为简单付出的代价。这种简单的方法模拟链式解决方案。简单解决方案的应用程序域总是比较有限。要求非重叠输入是强加的限制。这里的问题并没有说明他需要更多。如果PHP提供了一些没有链接的东西,这并不意味着我should@Eric这个问题特别指出了php的stru替换($keys,$values,$s)
在Python中的等价物是什么,猜猜看,php的行为与我的实现,echo stru替换(['a','b'],['b','a'],'ba')的行为相同
将显示aa
而不是ab
,这是一个反对PHP的论点,而不是你的实现。无论哪种方式,代码的行为都是随机给出aa
或bb
——请参见下面的Triptych评论