我有以下幾點:如何使re.split()包括
>>> x='STARSHIP_TROOPERS_INVASION_2012_LOCDE'
>>> re.split('_\d{4}',x)[0]
'STARSHIP_TROOPERS_INVASION'
我怎麼會得到包括一年?例如:
STARSHIP_TROOPERS_INVASION_2012
請注意有成千上萬的標題,我需要在每一年的分裂。我不能在這裏做一個正常的python split()
。
我有以下幾點:如何使re.split()包括
>>> x='STARSHIP_TROOPERS_INVASION_2012_LOCDE'
>>> re.split('_\d{4}',x)[0]
'STARSHIP_TROOPERS_INVASION'
我怎麼會得到包括一年?例如:
STARSHIP_TROOPERS_INVASION_2012
請注意有成千上萬的標題,我需要在每一年的分裂。我不能在這裏做一個正常的python split()
。
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。 – 2013-05-12 20:16:53
@BurhanKhalid它可能但我寧願不做任何關於OP從單個輸入字符串嘗試做什麼的假設。 – millimoose 2013-05-12 20:19:06
如果它總是將是相同的圖案,那麼爲什麼不:
>>> 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特殊序列在下面描述的字符串中匹配後面的 。要與 匹配文字'('或')',請使用(或)或將它們放在 字符類中:[(] [)]。
我明白了,謝謝你的解釋。 '\ d {4}'周圍的'()'做了什麼? – David542 2013-05-12 20:19:42
它使它成爲返回的捕獲組的一部分。 – 2013-05-12 20:21:05
嗯,我甚至不知道're.split()'有不同的行爲,如果你使用捕獲組。 – millimoose 2013-05-12 20:21:39
假設您希望在您想分割的字符串中有單個這樣的日期,則可以同時使用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
你真的需要'split'?從你的例子中不清楚。你可以用're.findall'或者(根據你的例子來判斷)''re.match''來獲得你需要的。 – 2013-05-12 20:14:11