2015-06-29 3 views
5

Карты Google Результаты часто отображаются таким образом:Как Python разделить персонажа, но сохранить этот символ?

enter image description here

'\n113 W 5th St\nEureka, MO, United States\n(636) 938-9310\n' 

Другой вариант:

enter image description here

'Clayton Village Shopping Center, 14856 Clayton Rd\nChesterfield, MO, United States\n(636) 227-2844' 

И еще:

enter image description here

'Wildwood, MO\nUnited States\n(636) 458-7707' 

Обратите внимание на изменение в размещении \n символов.

Я ищу, чтобы извлечь первые X строк в качестве адреса, а последняя строка - номер телефона. Регулярное выражение, такое как (.*\n.*)\n(.*), было бы достаточным для первого примера, но не подходит для двух других. Единственное, на что я могу положиться, это то, что номер телефона будет в форме (ddd) ddd-dddd.

Я думаю, что регулярное выражение, которое позволит каждому из возможных вариантов, будет трудно найти. Можно ли использовать split(), но сохранить характер, который мы разделили? Итак, в этом примере разделите на "(", чтобы разделить адрес и номер телефона, но сохранить этот символ по номеру? Я мог бы объединить "(" назад в split("(")[1], но есть ли более аккуратный способ?

+2

более простой способ: читать строки построчно , Когда строка не соответствует номеру телефона, сохраните ее в своей переменной адреса (список), когда шаблон соответствует сохранению результата в вашей телефонной переменной и присоединитесь к списку адресов с помощью '\ n', чтобы получить строку. –

+0

Вы хотите сделать это только с адресами США? –

ответ

7

Не используйте регулярное выражение. Просто разделите строку на '\n'. Последний индекс - номер телефона, остальные индексы - это адрес.

lines = inputString.split('\n') 
phone = lines[-1] if lines[-1].match(REGEX_PHONE_US) else None 
address = '\n'.join(lines[:-1]) if phone else inputString 

Python имеет много больших встроенные инструменты для работы со строками в более ... человечески ..., чем регулярное выражении позволяет.

+2

Регулярные выражения были бы полезны для проверки того, что последняя строка фактически является номером телефона. –

+3

Кроме того, _check_, что последний элемент является номером телефона, если в телефоне нет зарегистрированного номера телефона: 'phone = lines [-1], если строки [-1] .match (REGEX_PHONE_US) else None' где' REGEX_PHONE_US' - это скомпилированный шаблон, определенный в другом месте. –

+1

@ALtheX: Смешайте это с ответом. – ArtOfWarfare

1

Если вы правильно поняли, вы хотите получить «извлеките первые строки X как адрес». Предполагая, что все адреса, которые вам нужны, в США, этот код регулярного выражения должен работать на вас.В любом случае, он работает на 3 примерах вы обеспечили:

import re 
x = 'Wildwood, MO\nUnited States\n(636) 458-7707' 
print re.findall(r'.*\n+.*\States', x) 

Выход составляет:

['Wildwood, MO\nUnited States'] 

Если вы хотите напечатать его позже без \n вы можете сделать это следующим образом:

x = '\n113 W 5th St\nEureka, MO, United States\n(636) 938-9310\n' 
y = re.findall(r'.*\n+.*\States', x) 
y = y[0].rstrip() 

При печати y вывод:

113 W 5th St 
Eureka, MO, United States 

И, если вы хотите, чтобы извлечь номер телефона отдельно вы можете сделать это:

tel = '\n113 W 5th St\nEureka, MO, United States\n(636) 938-9310\n' 
num = re.findall(r'.*\d+\-\d+', tel) 
num = num[0].rstrip() 

При печати num вывод:

(636) 938-9310 
+0

Хорошо работает, спасибо Джо. – Pyderman

+0

@Pyderman Отлично! Рад помочь. –

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