我有一个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)
答案 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)