按顺序将字符串中的正则表达式匹配替换为列表中的项目

时间:2015-06-23 14:09:31

标签: python regex

例如,我有一个像:

这样的字符串

'blah blah 1.344 blah 1.455'

和列表如:

[2.888, 4.033]

我知道字符串和列表包含相同数量的数字,并希望使用正则表达式将字符串中的所有数字替换为列表中的数字。我想要这样的东西:

 re.sub('\d\.\d+', list[i], line)

但不知道如何让每个匹配替换为列表中的下一个项目,而不仅仅是相同的项目。我想保留所有的文本和所有的空白完全相同,所以拆分到列表,替换索引和加入似乎不是我需要的东西。

3 个答案:

答案 0 :(得分:4)

this post的第二个repl参数可以是一个任意函数,它接受一个match对象并返回一个字符串来替换它。在你的情况下:

>>> import re
>>> repl = [2.888, 4.033]
>>> re.sub(
    r'\d\.\d+',  # note raw string to avoid issues with backslashes
    lambda match: str(repl.pop(0)),  # replace each match with the next item in the list
    'blah blah    1.344 blah   1.455'
)
'blah blah    2.888 blah   4.033'

答案 1 :(得分:3)

你可以这样做:

$json = json_decode($result, true);
if (is_array($json) && count($json) 
    && is_array($json['products']) && count($json['products']))
{
    foreach($json['products'] as $aProduct)
    {
       $id = $aProduct['id'];
       $title = $aProduct['title'];

       ...
    }
}

(我使用>>> re.sub('\d\.\d+', '{}', line).format(*list) 'blah blah 2.888 blah 4.033' 作为变量名称,因为在您使用它的问题中,覆盖list关键字是一个非常糟糕的主意)

答案 2 :(得分:2)

def repl(matchobj):
     return str(y.pop(0))
x='blah blah    1.344 blah   1.455'
y=[2.888, 4.033]
print re.sub(r"\d+\.\d+",repl,x)

您只需在re.sub

中创建替换功能即可