Как разбить строку на python на основе разделителя с разделителем в составе одного из чанков? - PullRequest
1 голос
/ 06 мая 2020

Ищете элегантный способ:

  1. Разделить строку на основе разделителя
  2. Вместо того, чтобы отбрасывать разделитель, делая его частью разделенных фрагментов.

Например, у меня есть данные о дате и времени, такие как:

D2018-4-21T3:55+6
2018-4-4T3:15+6
D2018-11-21T12:45+6:30

Иногда есть D, иногда нет (однако я всегда хочу, чтобы он был частью первого фрагмента), без конечных или ведущих нули для времени и часового пояса иногда имеют только ":". Дело в том, что необходимо разделить эти символы 'D, T, +', потому что сегменты могут не соответствовать длине sae. Если бы это было так, было бы проще разделить на основе индекса. Я хочу разделить их на несколько символов, таких как T и +, и сделать их частью данных, например:

['D2018-4-21', 'T3:55', 'TZ+6']
['D2018-4-4', 'T3:15', 'TZ+6']
['D2018-11-21', 'T12:45', 'TZ+6:30']

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

Сейчас мое уродливое решение выглядит так:

[i+j for _, i in enumerate(['D','T','TZ']) for __, j in enumerate('D2018-4-21T3:55+6'.replace('T',' ').replace('D', ' ').replace('+', ' +').split()) if _ == __]

1 Ответ

3 голосов
/ 06 мая 2020

Используйте regular expression

Ссылка: https://docs.python.org/3/library/re.html

(...)

Соответствует любому регулярному выражению внутри скобок и указывает начало и конец группы; содержимое группы может быть извлечено после того, как было выполнено сопоставление, и может быть сопоставлено позже в строке с помощью специальной последовательности \ number, описанной ниже. Чтобы сопоставить литералы '(' или ')', используйте (или) или заключите их в класс символов: [(], [)].

import re
a = '''D2018-4-21T3:55+6
2018-4-4T3:15+6
D2018-11-21T12:45+6:30'''

b = a.splitlines()
for i in b:
    m = re.search(r'^D?(.*)([T].*?)([-+].*)$', i)
    if m:
        print(["D%s" % m.group(1), m.group(2), "TZ%s" % m.group(3)])

Результат:

['D2018-4-21', 'T3:55', 'TZ+6']
['D2018-4-4', 'T3:15', 'TZ+6']
['D2018-11-21', 'T12:45', 'TZ+6:30']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...