2016-08-05 4 views
1

Прошу прощения, если заголовок не очень описательный. Я не знаю, как подвести итог моей проблеме в нескольких словах.Удалить номера условно?

Вот моя проблема. Я очищаю адреса, а некоторые из них вызывают некоторые проблемы.

У меня есть список разделителей (проспект, улица, дорога, место и т. Д. И т. Д.) И называется patterns.

Скажем, у меня есть этот адрес, например: SUITE 1603 200 PARK AVENUE SOUTH NEW YORK

Я хотел бы выход будет SUITE 200 PARK AVENUE SOUTH NEW YORK

Есть ли способ, которым я мог бы как-то посмотреть, чтобы увидеть, если есть 2 порции чисел (в этом случай 1603 и 200) перед одним из моих шаблонов, и если да, разделите первую партию чисел из моей строки? Удалите 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

Я использовал регулярное выражение, которое Стивен опубликовал выше, которое работает, однако есть случаи, когда он не работает.Например, если между двумя наборами чисел это что-то не получается. Будет ли ваше решение по-прежнему работать? – Harrison

+0

@hleggs 'SUITE 1603 ИСПЫТАНИЕ 200 PARK AVENUE SOUTH NEW YORK'' вернет« ЛЮКС-ТЕСТИРОВАНИЕ 200 PARK AVENUE SOUTH NEW YORK » – ospahiu

+0

Хорошо, отлично. 1 вопрос. Что, если бы был такой случай, как 'xxx 2e 57 east'? Я тестировал это, и он терпит неудачу. Я предполагаю, потому что есть буква сразу после номера 2? – Harrison

Смежные вопросы