如何使re.split()包容

时间:2013-05-12 20:11:48

标签: python regex

我有以下内容:

>>> x='STARSHIP_TROOPERS_INVASION_2012_LOCDE'
>>> re.split('_\d{4}',x)[0]
'STARSHIP_TROOPERS_INVASION'

我如何获得年份?例如:

STARSHIP_TROOPERS_INVASION_2012

请注意,有成千上万的标题,我需要在每年分开。我不能在这里做正常的python split()

3 个答案:

答案 0 :(得分:5)

A more straightforward solution将使用re.search() / MatchObject.end()

m = re.search('_\d{4}', x)
print x[:m.end(0)]

如果您想坚持split(),可以use a lookbehind

re.split('(?<=_\d{4}).', x)

(即使年份在字符串的末尾,这也可以工作,因为split()会返回一个带有原始字符串的数组,以防找不到分隔符。)

答案 1 :(得分:3)

如果它始终是相同的模式,那么为什么不:

>>> x = 'STARSHIP_TROOPERS_INVASION_2012_LOCDE'
>>> x[:x.rfind('_')]
'STARSHIP_TROOPERS_INVASION_2012'

对于原始正则表达式,由于您没有捕获匹配的组,因此它不属于您的匹配项:

>>> re.split('_\d{4}',x)
['STARSHIP_TROOPERS_INVASION', '_LOCDE']
>>> re.split('_(\d{4})',x)
['STARSHIP_TROOPERS_INVASION', '2012', '_LOCDE']

()将选择标记为captured group

  

匹配括号内的正则表达式,和   表示组的开始和结束;一组的内容可以   在执行匹配后检索,并且可以在以后匹配   在具有\ number特殊序列的字符串中,如下所述。至   匹配文字'('或')',使用(或),或将它们包含在一个   字符类:[(] [)]。

答案 2 :(得分:1)

您可以同时使用split()search(),假设您希望分割的字符串中有一个这样的日期。

import re
x='STARSHIP_TROOPERS_INVASION_2012_LOCDE'
date=re.search('_\d{4}',x).group(0)
print(date)

给出

>>> 
_2012

print(re.split('_\d{4}',x)[0]+date)

给出

STARSHIP_TROOPERS_INVASION_2012