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

ton*_*nga 21 python regex

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

000014_L_20111007T084734-20111008T023142.txt
000014_U_20111007T084734-20111008T023142.txt
...
Run Code Online (Sandbox Code Playgroud)

我想在第二个下划线'_'之前和之前提取中间的两个时间戳部分'.txt'.所以我使用了以下Python正则表达式字符串拆分:

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

但是这在返回的列表中给了我两个额外的空字符串:

time_info=['', '20111007T084734', '20111008T023142', '']
Run Code Online (Sandbox Code Playgroud)

我如何只获得两个时间戳信息?即我想:

time_info=['20111007T084734', '20111008T023142']
Run Code Online (Sandbox Code Playgroud)

Ell*_*lle 20

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

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

  • 由于 filter() 返回一个过滤器对象,因此您之后需要使用 list() :`time_info = list(filter(None, str_list))` (3认同)
  • @tonga 有,但不那么漂亮:`time_info = [x for x in re.split('^[0-9]+_[LU]_|-|\.txt$', f) if x]` (2认同)

JAB*_*JAB 15

不要使用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')
Run Code Online (Sandbox Code Playgroud)

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

  • 这是一个耻辱`split`没有"没有空字符串"选项. (11认同)
  • `re.split()`的实现方式应与其外部行为无关. (2认同)