2015-10-19 16 views
1

我如何拆分字符串轉換成基於包含在子字符字符串。例如,給定一個字符串"ABC12345..::",我想獲得像['ABC', '12345', '..::']這樣的列表。我知道每個子字符串的有效字符,但我不知道長度。所以字符串也可能看起來像"CC123:....:",在這種情況下,我想有['CC', '123', ':....:']作爲結果。發現的字母,數字或符號組

+2

你的意思是你想在拆分字母,數字和符號? –

+0

您是否需要考慮像「ABC123DEF」這樣的情況? – DSM

+0

是的,原則上三個「塊」中的字符集可以重疊。中間塊甚至可以是空的。所以,是的,這會導致問題。但對於我的具體問題,這種盡最大努力的方法工作得很好 – Christian

回答

4

在你的例子中,你似乎沒有任何東西可以分割(例如,C1之間沒有任何東西),但是你所擁有的是一個格式良好的模式,你可以匹配。所以只是簡單地創建一個圖案組你想匹配的字符串:

>>> import re 
>>> s = "ABC12345..::" 
>>> re.match('([A-Z]*)([0-9]*)([\.:]*)', s).groups() 
('ABC', '12345', '..::') 

替代,編譯模式爲可重複使用的正則表達式對象,並做到這一點:

>>> patt = re.compile('([A-Z]*)([0-9]*)([\.:]*)') 
>>> patt.match(s).groups() 
('ABC', '12345', '..::') 
>>> patt.match("CC123:....:").groups() 
('CC', '123', ':....:') 
+0

像魅力一樣工作。我甚至很接近,只是忘記了各個塊周圍的'(...)'括號。謝謝! – Christian

1

如果你想有一個非regex方法:

value = 'ABC12345..::' 
indexes = [i for i, char in enumerate(value) if char.isdigit()] # Collect indexes of any digits 
arr = [ value[:indexes[0]], value[indexes[0]:indexes[-1]+1], value[indexes[-1]+1:] ] # Use splicing to build list 

輸出:

['ABC', '12345', '..::'] 

另一個字符串:

value = "CC123:....:" 
indexes = [i for i, char in enumerate(value) if char.isdigit()] # Collect indexes of any digits 
arr = [ value[:indexes[0]], value[indexes[0]:indexes[-1]+1], value[indexes[-1]+1:] ] # Use splicing to build list 

輸出:

['CC', '123', ':....:'] 

編輯:

只是做一個標杆,metatoaster的方法比這個:)

2

匹配每個稍快帶有以下正則表達式的組

[0-9]+|[a-zA-Z]+|[.:]+ 
  • [0-9]+任何數字重複任意次,或
  • [a-zA-Z]+任何字母重複任意次,或
  • [.:]+任何點或冒號重複任意次

這將允許您匹配以任何順序分組,即:"123...xy::ab..98765PQRS"


import re 
print(re.findall(r'[0-9]+|[a-zA-Z]+|[.:]+', "ABC12345..::")) 

# => ['ABC', '12345', '..::'] 

ideone demo

相關問題