2016-07-04 19 views
-1
print (re.split(r'[a-fA-F]','finqwenlaskdjriewasFSDFddsafsafasa',re.I|re.M)) 
print (re.split(r'[a-fA-Z]','finqwenlaskdjriewasFSDFddsafsafasa',re.I|re.M)) 
print (re.split(r'\d*','sdfsfdsfds123212fdsf2')) 
print (re.split(r'\d','sdfsfdsfds123212fdsf2')) 
print (re.split(r'\w+','dsfsf sdfdsf sdfsdf sfsfd')) 

['', 'inqw', 'nl', 'sk', 'jri', 'w', 's', 'S', '', '', 'dsafsafasa'] 
['', 'inqw', 'nl', 'sk', 'jri', 'w', 's', '', '', '', 'ddsafsafasa'] 
['sdfsfdsfds', 'fdsf', ''] 
['sdfsfdsfds', '', '', '', '', '', 'fdsf', ''] 
['', ' ', ' ', ' ', ''] 

我覺得這裏的輸出真的很奇怪。分割字符串的模式有時會在輸出列表中變爲「',但在其他時間會消失。在python re.split的輸出對我來說沒有意義

+1

爲什麼要在分割時捕獲任何東西? –

+1

@jonrsharpe這並不能解釋*「將字符串拆分的模式轉換爲」*「誤解。 –

+0

在大多數情況下,您正在分割*單個字符*。在你提供的例子中,'re.I'和're.M'都是無用的。 – Bakuriu

回答

3

有時將分割字符串的模式轉換爲'',但其他時間消失。

沒有,圖案(或它匹配)是從未包含在輸出那裏。那些''之間的的比賽。因爲這就是re.split所做的。你的榜樣:

>>> re.split(r'\d','sdfsfdsfds123212fdsf2') 
['sdfsfdsfds', '', '', '', '', '', 'fdsf', ''] 

你被數字拆分,和子'123212'有六位數字,所以它們之間有5個空的字符串。這就是爲什麼輸出中有五個空字符串的原因。

0

輸出並不奇怪,這是故意的。 From the docs

如果在分隔符中存在捕獲組並且它在字符串的開頭匹配,則結果將以空字符串開頭。這同樣適用於該字符串的結尾:

>>> re.split('(\W+)', '...words, words...') 
['', '...', 'words', ', ', 'words', '...', ''] 

這樣,分離器組件總是在結果列表中的相同的相對指數發現。

強調添加指出爲什麼這樣做。這同樣適用於字符串和非捕獲分隔符內的「空」序列。基本上,分隔符前後都有內容 - 即使分隔符未被捕獲且內容爲空。類似的方法str.splitactually does the same

如果您知道分隔符,可以讓您始終重建初始字符串。捕獲分離器並連接,或將分離器插入連接是等同的。 ''.join(re.split('(%s)' % sep, ':::words::words:::')) == sep.join(re.split('%s' % sep, ':::words::words:::'))

1

首先,你基本上提供maxsplit=10參數,而不是flags=re.I|re.

其次,分離器變成'';而不是是字符串隔板之間:

>>> re.split(r':', 'foo:bar::baz:') 
['foo', 'bar', '', 'baz', ''] 

通知隔板'' 2之間,以及在端部。

隔板本身的結果,除非你的正則表達式中包含捕獲組((...)):

>>> re.split(r'(:)', 'foo:bar::baz:') 
['foo', ':', 'bar', ':', '', ':', 'baz', ':', ''] 

三:即使r'\d*'通常會匹配在字符串的開頭,結尾字符串,每個字符之間,當前只有非零長度的匹配被認爲是re.split,因此該模式的行爲類似於r\d+。但是,在Python 3.6及更高版本中,此類行爲可能會發生更改,並在Python 3.5上發出警告FutureWarning: split() requires a non-empty pattern match.