Разложение регулярных выражений Python без пустой строки

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

000014_L_20111007T084734-20111008T023142.txt
000014_U_20111007T084734-20111008T023142.txt
...

Я хочу извлечь средние две метки времени после второго подчеркивания '_' и до '.txt'. Таким образом, я использовал следующее разделение строки регулярного выражения Python:

time_info = re.split('^[0-9]+_[LU]_|-|\.txt$', f)

Но это дает мне две лишние пустые строки в возвращаемом списке:

time_info=['', '20111007T084734', '20111008T023142', '']

Как получить только две метки времени? то есть я хочу:

time_info=['20111007T084734', '20111008T023142']

Ответы

Ответ 1

Не используйте re.split(), используйте метод groups() для объектов regex Match/SRE_Match.

>>> f = '000014_L_20111007T084734-20111008T023142.txt'
>>> time_info = re.search(r'[LU]_(\w+)-(\w+)\.', f).groups()
>>> time_info
('20111007T084734', '20111008T023142')

Вы даже можете назвать группы захвата и получить их в dict, хотя для этого вы используете groupdict(), а не groups(). (Шаблон регулярного выражения для такого случая был бы чем-то вроде r'[LU]_(?P<groupA>\w+)-(?P<groupB>\w+)\.')

Ответ 2

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

time_info = re.split('^[0-9]+_[LU]_|-|\.txt$', f)
time_info = filter(None, str_list)

Ответ 3

Если временные метки всегда после второго _, то вы можете использовать str.split и str.strip:

>>> strs = "000014_L_20111007T084734-20111008T023142.txt"
>>> strs.strip(".txt").split("_",2)[-1].split("-")
['20111007T084734', '20111008T023142']

Ответ 4

>>> f='000014_L_20111007T084734-20111008T023142.txt'
>>> f[10:-4].split('-')
['0111007T084734', '20111008T023142']

или, несколько более общий:

>>> f[f.rfind('_')+1:-4].split('-')
['20111007T084734', '20111008T023142']