2013-05-12 65 views
1

我有以下幾點:如何使re.split()包括

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

我怎麼會得到包括一年?例如:

STARSHIP_TROOPERS_INVASION_2012 

請注意有成千上萬的標題,我需要在每一年的分裂。我不能在這裏做一個正常的python split()

+0

你真的需要'split'?從你的例子中不清楚。你可以用're.findall'或者(根據你的例子來判斷)''re.match''來獲得你需要的。 – 2013-05-12 20:14:11

回答

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()在未找到分隔符的情況下返回一個包含原始字符串的數組。)

+0

我喜歡向後看,但我認爲'重新'可能在這裏矯枉過正。儘管如此,我還是+1。 – 2013-05-12 20:16:53

+0

@BurhanKhalid它可能但我寧願不做任何關於OP從單個輸入字符串嘗試做什麼的假設。 – millimoose 2013-05-12 20:19:06

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

匹配任何古拉r表達式在圓括號內,並且 指示組的開始和結束;一個組的內容可以是 ,匹配已執行後可以被匹配,並且可以使用\ number特殊序列在下面描述的字符串中匹配後面的 。要與 匹配文字'('或')',請使用(或)或將它們放在 字符類中:[(] [)]。

+0

我明白了,謝謝你的解釋。 '\ d {4}'周圍的'()'做了什麼? – David542 2013-05-12 20:19:42

+0

它使它成爲返回的捕獲組的一部分。 – 2013-05-12 20:21:05

+0

嗯,我甚至不知道're.split()'有不同的行爲,如果你使用捕獲組。 – millimoose 2013-05-12 20:21:39

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