2015-11-04 35 views
3

我有一個字符串形式匹配位數

s1 = "Schblaum 12324 tunguska 24 234n" 
s2 = "jacarta 331 matchika 22 234k" 
s3 = "3239 thingolee 80394 234k" 

的順序,我需要這些字符串在兩個字符串分開,只是在字符串中間的號碼後,忽略字符串的第一部分是否有數字。像

["Schblaum 12324", "tunguska 24 234n"] 
["jacarta 331", "matchika 22 234k"] 
["3239 thingolee 80394", "bb 6238"] 

東西,我試圖用正則表達式的形式

finder = re.compile(""\D(\d+)\D"") 
finder.search(s1) 

無濟於事。有沒有辦法做到這一點,也許沒有使用正則表達式? 乾杯!

EDIT:剛發現其中初始字符串只是

"jacarta 43453" 

沒有其他部件的情況。這應該返回

["jarcata 43453"] 
+0

因爲我犯了一個錯誤。固定。 – Ivan

+0

我刪除了[tag:pandas],因爲它在問題的任何地方都沒有引用。 –

+0

請提交解決方案,以便其他人可以從中學習 –

回答

0

即使沒有正則表達式,所有你在做的是尋找數量和分裂後。嘗試:

s = "Schblaum 12324 tunguska 24 234n" 
words = s.split() 
for idx, word in enumerate(words[1:], start=1): # skip the first element 
    if word.isdigit(): 
     break 
before, after = ' '.join(words[:idx+1]), \ 
       ' '.join(words[idx+1:]) 

你也可以使用re.split找到回顧後,看到一個數字空間,但你必須在事後處理,因爲它會後的第一個分裂爲好。

import re 

s3 = "3239 thingolee 80394 234k" 
result = re.split(r"(?<=\d)\s", s3, 2) # split at most twice 
if len(result) > 2: 
    before = ' '.join(result[:2]) 
else: 
    before = result[0] 
after = result[-1] 
3

使用re.findall

>>> import re 
>>> s1 = "Schblaum 12324 tunguska 24 234n" 
>>> re.findall(r'^\S+\D*\d+|\S.*', s1) 
['Schblaum 12324', 'tunguska 24 234n'] 
>>> s2 = "jacarta 331 matchika 22 234k" 
>>> s3 = "3239 thingolee 80394 234k" 
>>> re.findall(r'^\S+\D*\d+|\S.*', s2) 
['jacarta 331', 'matchika 22 234k'] 
>>> re.findall(r'^\S+\D*\d+|\S.*', s3) 
['3239 thingolee 80394', '234k'] 
+0

謝謝!如果字符串沒有第二部分會發生什麼?例如,只有「jacarta 331」? – Ivan

+0

你試過我的代碼嗎?它應該工作..'re.findall(r'^ \ S + \ D * \ d + | \ S. *',「jacarta 43453」)' –

+0

它的工作原理,但我不得不作出一個條件來檢查第二部分第一部分的分割列表是相同的。如果發生這種情況,第二部分應該是空的。 – Ivan