2011-06-30 22 views
3

我使用re.split()將字符串分隔爲標記。目前我用作參數的模式是[^\dA-Za-z],它從字符串中檢索字母數字標記。Python中的單獨數字/字母標記

但是,我需要的是還將具有數字和字母的標記分爲僅具有一個或另一個標記的標記,例如。

re.split(pattern, "my t0kens") 

將返回["my", "t", "0", "kens"]

我猜我可能需要使用lookahead/lookbehind,但我不確定這是否真的有必要或者是否有更好的方法來做到這一點。

回答

7

請改用findall方法。

>>> print re.findall ('[^\d ]+', "my t0kens"); 
['my', 't', 'kens'] 
>>> print re.findall ('[\d]+', "my t0kens"); 
['0'] 
>>> 

編輯:更好的方式從巴特的評論下面。

>>> print re.findall('[a-zA-Z]+|\\d+', "my t0kens") 
['my', 't', '0', 'kens'] 
>>> 
+6

,你可以在你的兩個建議結合擠:'打印re.findall( '[A-ZA-Z] + | \\ d +',「我的t0kens「)',它返回:'['my','t','0','kens']' –

+0

@Bart - 是的,這樣好多了! – kjp

+1

隨着巴特的編輯,這肯定比我的答案更好。 +1 –

0

並不完美,但是從下面的列表中刪除的空間很容易:-)

re.split('([\d ])', 'my t0kens') 
['my', ' ', 't', '0', 'kens'] 

docs:「通過模式的出現分割字符串如果捕獲括號中的圖案被使用,那麼所有的文字模式中的組也作爲結果列表的一部分返回。「

2
>>> [x for x in re.split(r'\s+|(\d+)',"my t0kens") if x] 
['my', 't', '0', 'kens'] 

通過使用圖案內捕獲括號中,標記也將返回。由於您只想維護數字而不是空格,因此我已將\s留在括號外,因此返回None,然後可以使用簡單的循環將其過濾掉。

+0

如果只有一個數字被檢索 - 這在一般情況下可能有多個,如果我的例子誤導了你,對不起。 – caroline

+0

這很容易修復。答案已更新。當然,kjp答案中的解決方案仍然更加優雅。改爲使用它。 –

1

應該是一行代碼

re.findall('[a-z]+|[\d]+', 'my t0kens') 
+0

只有小寫字母? –