2016-08-05 59 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