Python使用re.sub搜索字符串并从字典更改

时间:2018-09-09 10:19:28

标签: python mongodb subprocess

我有一个python脚本,我在其中读取csv文件,并且要在csv文件中的一列上搜索并从字典中替换。 如果我在csv和字典中都具有100%匹配的字段,则我的代码有效。 我的问题是,在字典中,包含来自csv的匹配字符串的字段可以在用逗号分隔的长字符串内,因此我想在字典字符串中进行搜索,并且在任何部分匹配项中都想从字典中更改值。 例如,在newdata下面的代码中,示例如下:

foreach($printdata as $data) { 
   fputcsv($file,$data); 
}

我的csv字段2是我要执行re.sub的编号。 可以说我在那个csv字段中有数字:4638138399 在那种情况下,我想在字典(newdata)中搜索该内容,并在此示例“ lake.se”中更改为域,因为该数字在最后一个字典(newdata)中。 所以我的问题是我可以在行上更改

u'46764967051,46490797539,4639238933': u'google.com', u'46104376787335,46739600111': u'bt.se', u'46700961026,4638138399': u'lake.se'

要使其搜索任何匹配项,而不仅仅是完全匹配项?

我的代码:

domain = re.sub(domain, lambda find_all: newdata.get(find_all.group(0), domain), domain)

1 个答案:

答案 0 :(得分:2)

一种方法是重新设置newdata的位置,以使它的每个键都有一个不同的键,而不是由多个逗号分隔的数字组成。这是有道理的,因为字典条目最容易通过其确切键(而不是键的子字符串)查找。只需将newdata[numbers] = domain行替换为for n in numbers.split(','): newdata[n] = domain。这是一个独立的示例:

import re

x = [
    dict(numbers = u'46764967051,46490797539,4639238933',
        domain = u'google.com'),
    dict(numbers = u'46104376787335,46739600111',
        domain = u'bt.se'),
    dict(numbers = u'46700961026,4638138399',
        domain = u'lake.se')]
newdata = {}
for entry in x:
    numbers = entry.pop('numbers')
    numbers = numbers.replace("+","")
    domain = entry.pop('domain')
    for n in numbers.split(','):
        newdata[n] = domain

s = "my favorite site is 46490797539"
s = re.sub(r"\d+", lambda m: newdata[m.group(0)], s)
print(s)