Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Python中替换字符串时,可以传递字典吗?_Php_Python_Regex_String - Fatal编程技术网

Php 在Python中替换字符串时,可以传递字典吗?

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(

在PHP中,您有
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评论