Разложение регулярных выражений 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']