2016-08-05 61 views
1

如果標題不是非常具有描述性,我很抱歉。我不知道如何用幾句話總結我的問題。有條件地刪除號碼嗎?

這是我的問題。我正在清理地址,其中一些導致了一些問題。

我有一個名稱爲patterns的分隔符(大道,街道,道路,地方等等等)的列表。

比方說,我有這個地址,例如:SUITE 1603 200 PARK AVENUE SOUTH NEW YORK

我想輸出爲SUITE 200 PARK AVENUE SOUTH NEW YORK

有什麼辦法,我可以以某種方式看看是否有數字的2個批次(本case 1603200)之前,我的模式之一,如果是這樣,從我的字符串剝離第一批數字?即刪除1603並保留200

更新:不過它目前去除所有的數字

address = re.sub("\d+", "", address):我已經添加了此行我的代碼。我認爲通過放置,1後地址它只會刪除第一次出現,但事實並非如此

+0

有很多選擇,但SO不是代碼寫入服務。您可以對字符串進行切片以獲取列表,然後只加入其中的一部分。 –

+0

使用['re'模塊](https://docs.python.org/2/library/re.html)。 – pzp

+0

@pzp謝謝你的建議!我已經將這行添加到我的代碼中:'address = re.sub(「\ d +」,「」,address)'但是它當前刪除了所有數字。我認爲通過在地址後加''1',它只會刪除第一次發生,但事實並非如此。 – Harrison

回答

3

如果你想申請這個替換當你的「分隔符」的詞彙之一是使用,並且只有當有兩個數字時,可以使用fancier正則表達式。

import re 

pattern = r"\d+ +(\d+ .*(STREET|AVENUE|ROAD|WHATEVER))" 
input = "SUITE 1603 200 PARK AVENUE SOUTH NEW YORK" 
output = re.sub(pattern, "\\1", input) 

print(output) #SUITE 200 PARK AVENUE SOUTH NEW YORK 
+0

不錯,我刪除了我的答案,錯過了只有第一個數字的部分。一旦它被拒絕 - 似乎無法在接受它時刪除它。 – Bahrom

+0

也許你應該讓街道,大道等羣體不捕獲:'(?:STREET | AVENUE | ROAD | WHATEVER)'。 – pzp

+0

@pzp:是的,那可以工作得很好。 – recursive

0

你對你想要做什麼的描述不是很清楚,但如果我理解正確,你想是刪除數字序列的第一次出現?

你能做到這一點,而無需使用正則表達式

s = 'SUITE 1603 200 PARK AVENUE SOUTH NEW YORK' 
l = s.split(' ') 
for i, w in enumerate(l): 
    for c in w: 
     if c.isdigit(): 
      del l[i] 
     break 
print ' '.join(l) 

輸出:>>> SUITE 200 PARK AVENUE SOUTH NEW YORK

+0

我正在使用Steven在上面發佈的正則表達式,它可以工作,但有些情況下它不起作用。例如,如果兩組數字之間有任何內容失敗。你的解決方案仍然有效嗎? – Harrison

+0

@ hleggs'套房1603測試200公園大道南紐約''會返回'套房測試200公園大道南紐約' – ospahiu

+0

好吧,太棒了。還有1個問題。如果有像'xxx 2e 57 east'這樣的情況怎麼辦?我已經測試過,並且失敗了。我猜是因爲數字2之後有一個字母? – Harrison