разделить строку в соответствии с ограничивающим символом с помощью регулярного выражения

#python #regex #split

#python #регулярное выражение #разделить

Вопрос:

У меня проблема, когда мне нужно создать словарь Python с заданной строкой. Строка имеет определенный шаблон следующим образом:

 string = 'streetName=BENEDITO DE PAULA, QD 03 LT 03, state=AM, complement=SJ BANDEIRANTES, number=4, country=BRA'
  

Разделение не может быть выполнено с помощью запятой, потому что в середине текста есть запятая, которая должна стать строкой.
Мне нужно, чтобы разделение было выполнено путем создания следующего списка ниже, чтобы позже он стал словарем
Ключи словаря разделяются на равные sinal (=), а значением является последующий текст.

 list = ['streetName=BENEDITO DE PAULA, QD 03 LT 03', 'state=AM', 'complement=SJ BANDEIRANTES', 'number=4', 'country=BRA']
  

Итак, мне нужно сгенерировать список из регулярного выражения, которое, по моему мнению, должно учитывать текст (, TEXT=)

Затем я сгенерирую словарь следующим образом

 dict(v.split("=") for v in re.split("(REGEX)", string))
  

Использовал приведенную ниже функцию, но в данном случае это не решает проблему

 def convert_to_json(x):
    dic = dict(v.split("=") for v in x.split(","))
    return json.dumps({k.strip():v for (k,v) in dic.items()})
  

Комментарии:

1. Предполагая, что вы знаете, какие слова вам нужно проверить, которые вы не хотели бы разделять, вы можете использовать endswith функцию python. То есть разделить по запятой, но затем выполнить итерацию по этому списку результатов и соединить последовательные слова запятой, если они заканчиваются определенным словом или содержат определенное слово, или что вам нужно.

Ответ №1:

Вы можете разделить шаблон w = , поскольку знаете, что ключи не содержат символов, отличных от word, и захватить разделенные символы. Это оставит вас с конечным пробелом и запятой, но это не так уж сложно очистить:

 import re

string = 'streetName=BENEDITO DE PAULA, QD 03 LT 03, state=AM, complement=SJ BANDEIRANTES, number=4, country=BRA'

pairs = re.split(r'(w =)', string)[1:]   
[a   b.strip(', ') for a, b in zip(pairs[::2], pairs[1::2])]
  

Приводит к :

 ['streetName=BENEDITO DE PAULA, QD 03 LT 03',
 'state=AM',
 'complement=SJ BANDEIRANTES',
 'number=4',
 'country=BRA']
  

Ответ №2:

Регулярное выражение будет сложно записать здесь, потому что жадное сопоставление будет соответствовать слишком большому количеству запятых, а нежадное сопоставление будет соответствовать слишком небольшому количеству запятых. Вместо этого я бы решил это, разделив текст запятой, а затем проверив каждую подстроку, чтобы увидеть, содержит ли она знак равенства.

 def convert_to_dict(s):
    raw_items = s.split(", ")
    items = []
    for item in raw_items:
        if "=" in item:
            items.append(item)
        elif len(items) > 0:
            items[-1]  = ", "   item
        else:
            raise ValueError("Invalid string: dictionary keys cannot contain commas")
    result = {}
    for item in items:
        key, value = item.split("=", maxsplit=1)
        result[key] = value
    return result