Python использует re.sub для поиска строки и изменения из словаря - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть скрипт на python, в котором я читаю CSV-файл, и по одному столбцу в CSV-файле, который я хочу найти и заменить из словаря.Мой код работает, если у меня есть 100% совпадающие поля как в CSV, так и в словаре.Моя проблема в том, что в словаре поле, содержащее совпадающую строку из csv, может быть внутри длинной строки, разделенной запятой, поэтому я хочу искать в строке словаря и при любом частичном совпадении я хочу заменить значение из словаря.Пример из кода под newdata выглядит следующим образом:

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

И мое поле csv 2 - это то место, где у меня есть номер, с которым я хочу выполнить повторную подпункт.Допустим, у меня есть номер в этом поле csv: 4638138399 В этом случае я хочу searach для этого в словаре (newdata) и перейти к домену в этом примере "lake.se", как это число в последнем словаре (newdata).Итак, мой вопрос, что я могу изменить в строке

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

Чтобы он выполнял поиск любого совпадения, а не только полного совпадения?

Мой код:

client = MongoClient('mongodb://ip-addr:27017/user')
db = client['user']

x   = []
cur = db.user.find()
for i in cur:
    x.append(i)

newdata = {}    
for entry in x:
    numbers = entry.pop('numbers')
    numbers = numbers.replace("+","")
    domain = entry.pop('domain')
    newdata[numbers] = domain

def unicode_csv_reader(unicode_csv_data, dialect=csv.excel, **kwargs):
# csv.py doesn't do Unicode; encode temporarily as UTF-8:
csv_reader = csv.reader(utf_8_encoder(unicode_csv_data),
                        dialect=dialect, **kwargs)
for row in csv_reader:
    # decode UTF-8 back to Unicode, cell by cell:
    yield [unicode(cell, 'utf-8') for cell in row]

def utf_8_encoder(unicode_csv_data):
    for line in unicode_csv_data:
        yield line.encode('utf-8')


reader = unicode_csv_reader(codecs.open("201807_12_49333_N29069.csv", 
encoding="iso-8859-1"))
for row in reader:
    domain = row[2].encode('ascii') 
    domain = str(domain)
    domain = re.sub(domain, lambda find_all: newdata.get(find_all.group(0), domain), domain)
    row[2] = domain
    print(row[2], row[3]) 

1 Ответ

0 голосов
/ 09 сентября 2018

Один из подходов состоит в том, чтобы перенастроить 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...