Python正则表达式分裂没有空字符串

时间:2013-05-30 16:01:58

标签: python regex

我有以下显示此模式的文件名:

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']

5 个答案:

答案 0 :(得分:17)

我不是Python专家,但也许你可以从列表中删除空字符串?

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

答案 1 :(得分:14)

请勿使用re.split(),使用正则表达式groups() / 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 :(得分:3)

如果时间戳总是在第二个_之后,那么您可以使用str.splitstr.strip

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

答案 3 :(得分:1)

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

或者更为一般:

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

答案 4 :(得分:1)

由于这是在Google上出现的,为了完整起见,请尝试使用re.findall作为替代!

这确实需要重新考虑一下,但是它仍然像split一样返回匹配列表。这使其成为某些现有代码的理想替代品,并且摆脱了不需要的文本。将其与lookaheads and/or lookbehinds配对,您会得到非常相似的行为。

是的,这有点像“您在问一个错误的问题”,并且不使用re.split()。它确实解决了潜在的问题-您的匹配项列表中突然包含零长度的字符串,而您不希望这样做。