Как я могу использовать Python re.split (), чтобы составить список (не точный) из ['key = value', 'k = v', 'k = v']? - PullRequest
0 голосов
/ 27 февраля 2020

Предисловие: я не эксперт по регулярным выражениям

Я создаю сценарий Python, который будет анализировать сообщения журнала и создавать список пар ключ / значение в сообщении журнала.

У меня есть строка ввода, которая выглядит следующим образом:

uuid = 00b544de-2c89-4e40-a39f-1ef60f0273ca версия = 3df1e743-439e- 49a5-bf12-ba49e54c2a9d creationTime = 2020-02-26 04: 09: 02.152073 lastUpdateTime = 2020-02-26 04: 09: 02.152073 name = My Имя объекта комментарий = создать мой объект тип = пользовательский customType = SCT returnValueOnAccess = true timeFormatString = ГГГГ min = 49 max = 20000 specialCharacter = X specialType = BigAndSmall numberOfBigDigits = 0 numberOfSmallDigits = 4

Я хотел бы взять эту строку и создать такой список:

[
    'uuid=00b544de-2c89-4e40-a39f-1ef60f0273ca', 
    'version=3df1e743-439e-49a5-bf12-ba49e54c2a9d', 
    'creationTime=2020-02-26 04:09:02.152073', 
    ..., 
    'numberOfSmallDigits=4'
]

Я НЕ хочу словарь.

Я бы хотел нравится использовать re.split (), Я просто не могу понять правильный шаблон регулярного выражения для выполнения sh моей задачи.

У нас есть другие кодовые базы, которые будут использовать шаблон регулярного выражения, который мы придумали для выполнения sh той же задачи, в противном случае я будет делать это более Pythoni c способом.

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

Я пробовал несколько вариантов прогнозирования, прогнозирования и каждого шаблона регулярного выражения между ними.

Вот код из моей песочницы, который НЕ РАБОТАЕТ:

log = 'uuid=00b544de-2c89-4e40-a39f-1ef60f0273ca version=3df1e743-439e-49a5-bf12-ba49e54c2a9d creationTime=2020-02-26 04:09:02.152073 lastUpdateTime=2020-02-26 04:09:02.152073 name=My Object Name comment=create my object type=Custom customType=SCT returnValueOnAccess=true timeFormatString=YYYY min=49 max=20000 specialCharacter=X specialType=BigAndSmall numberOfBigDigits=0 numberOfSmallDigits=4'
print(re.split(r'(?:(?<=\s)|(?<=\A))([^\s=]+)=(.*?)(?=(?:\s[^\s=]+=|$))', log))
print(re.split(r' +(?=\w+)(?==+)', log))
print(re.split(r'\s+', log))
print(re.split(r'.*(?=\w*)(?==)', log))
print(re.split(r'\w*(?=\w*)(?==)', log))
print(re.split(r'\w*\s*(?=\w*)(?==)', log))
print(re.split(r'(\w+|\s+)+(?=\w*)(?==)', log))
print(re.split(r'(?=(?:\w*)(?:=))+(\w+|\s+)+', log))
print(re.split(r'(?:(?:\w*)(?:=))+(\w+|\s+)+(?:(?:\w*)(?:=))', log))
print(re.split(r'(?<=\=)(.*?)(?=\w+=)', log))
print(re.split(r'((?<=\=).*?(?=\w+=))+', log))

Любая помощь будет принята с благодарностью!

1 Ответ

4 голосов
/ 27 февраля 2020

Вы можете использовать положительный взгляд вперед в своем разделении, чтобы сказать разделить пробелом, где после пробела следует какое-то слово, а затем равно

import re
string = "uuid=00b544de-2c89-4e40-a39f-1ef60f0273ca version=3df1e743-439e-49a5-bf12-ba49e54c2a9d creationTime=2020-02-26 04:09:02.152073 lastUpdateTime=2020-02-26 04:09:02.152073 name=My Object Name comment=create my object type=Custom customType=SCT returnValueOnAccess=true timeFormatString=YYYY min=49 max=20000 specialCharacter=X specialType=BigAndSmall numberOfBigDigits=0 numberOfSmallDigits=4"
my_list = re.split(r'\s(?=\w+=)', string)
print(*my_list, sep="\n")

ВЫХОД

uuid=00b544de-2c89-4e40-a39f-1ef60f0273ca
version=3df1e743-439e-49a5-bf12-ba49e54c2a9d
creationTime=2020-02-26 04:09:02.152073
lastUpdateTime=2020-02-26 04:09:02.152073
name=My Object Name
comment=create my object
type=Custom
customType=SCT
returnValueOnAccess=true
timeFormatString=YYYY
min=49
max=20000
specialCharacter=X
specialType=BigAndSmall
numberOfBigDigits=0
numberOfSmallDigits=4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...