анализ строки с помощью python регулярных выражений необязательных именованных групп - PullRequest
2 голосов
/ 04 августа 2020

Я борюсь с python named group re

У меня есть следующая строка: "blah blah id=xyz, blah blah foo bar=zxy] blah baz=a}" завершающие символы: ,]}

, и я хотел бы получить named dict используя шаблон регулярного выражения, который выглядит следующим образом:

{'id': 'xyz', 'foo bar': 'zxy', 'baz': 'a'} группы должны быть необязательными

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

мое текущее решение использует следующее предварительное совпадение:

(id=.* ?[, }\]] |baz=.* ?[, }\]] |foo bar=.* ?[, }\]])

он работает, но требует значительной постобработки (разделение строк и чередование)

         for i in ae2:
            key, value = i.split('=', 1)
            altevent2[key] = value.strip('},] ')

Кроме того, было бы здорово избавиться от пробелов / непечатаемых символов, но только когда они находятся в начале / конце значения

если это вообще возможно, постобработка не требуется - мне нужна большая производительность

Edit1: список, если dict 'IDs' известен заранее, в этом случае это будет 'id', ' foo bar ',' baz '

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

Одно простое решение - использовать re.findall.

s = "blah blah id=xyz, blah blah foo bar=zxy] blah baz=a}"
re.findall('(id|foo bar|baz)=([^,}\]]+)', s)
0 голосов
/ 04 августа 2020

Вы можете использовать метод re.split(), чтобы отделить начальную строку от ваших конечных точек и найти совпадение с вашими ключами в вашем dict, например, в коде.

import re
    
ex = "blah blah id=xyz, blah blah foo bar=zxy] blah baz=a}"
dict_keys = ["id", "foo bar", "baz"]

end = re.split(", |] |}", ex)  # ['blah blah id=xyz', ' blah blah foo bar=zxy', ' blah baz=a', '']

result = {}

for i in dict_keys:
    for j in end:
        if i in j:
            result[i] = j.partition("=")[2]

OB: я стараюсь избегать "2 за", но я не мог найти способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...