35

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

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

5 回答 5

27

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

str_list = re.split('^[0-9]+_[LU]_|-|\.txt$', f)
time_info = filter(None, str_list)
于 2013-05-30T16:06:37.593 回答
22

不要使用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')

您甚至可以命名捕获组并在字典中检索它们,尽管您使用groupdict()而不是groups()这样做。(这种情况的正则表达式模式类似于r'[LU]_(?P<groupA>\w+)-(?P<groupB>\w+)\.'

于 2013-05-30T16:12:24.007 回答
3

如果时间戳总是在秒之后,_那么您可以使用str.splitand str.strip

>>> strs = "000014_L_20111007T084734-20111008T023142.txt"
>>> strs.strip(".txt").split("_",2)[-1].split("-")
['20111007T084734', '20111008T023142']
于 2013-05-30T16:10:05.763 回答
3

由于这出现在谷歌上并且为了完整起见,请尝试使用re.findall作为替代方案!

这确实需要重新考虑,但它仍然会像 split 一样返回匹配列表。这使它成为一些现有代码的一个很好的替代品,并摆脱了不需要的文本。将它与前瞻和/或后瞻配对,您将获得非常相似的行为。

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

于 2020-05-05T14:46:08.757 回答
1
>>> f='000014_L_20111007T084734-20111008T023142.txt'
>>> f[10:-4].split('-')
['0111007T084734', '20111008T023142']

或者,更笼统地说:

>>> f[f.rfind('_')+1:-4].split('-')
['20111007T084734', '20111008T023142']
于 2013-05-30T16:10:34.513 回答