我有以下内容:
>>> x='STARSHIP_TROOPERS_INVASION_2012_LOCDE'
>>> re.split('_\d{4}',x)[0]
'STARSHIP_TROOPERS_INVASION'
我如何获得年份?例如:
STARSHIP_TROOPERS_INVASION_2012
请注意,有成千上万的标题,我需要在每年分开。我不能在这里做正常的python split()
。
答案 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