Получить адрес из абзаца с регулярным выражением - PullRequest
0 голосов
/ 03 октября 2011

Хорошо, это немного больно. Я делаю кое-что с Python, пытаясь получить адрес из нескольких строк плохо помеченного HTML. Вот пример формата:

256-555-5555<br/>
1234 Fake Ave S<br/>
Gotham (Lower Ward)<br/>

Я бы хотел получить только 1234 Fake Ave S, Gotham. Есть идеи? Я занимаюсь регулярными выражениями всю ночь, и теперь мой мозг забит ...

Edit: Более подробно о том, какие возможны сценарии того, как будут поступать данные. Иногда первая строка будет там, иногда нет. Все адреса, которые я видел, содержат Ave, Way, St, хотя я бы предпочел не использовать это в качестве фактора при выборе, так как я не уверен, что они всегда будут такими. Вторая и третья строка - alPhone (или возможный адрес электронной почты или веб-сайт):

То, что я имел в виду, было чем-то, что

  1. Выбирает все от 2-й до последней строки (так, вторая строка, если есть три строки, первая строка, если только две, когда нет номера телефона).
  2. Выбирает все в последней строке, кроме скобок.
  3. Объедините 2-ю до последней строки и последнюю строку, добавив между ними ",".

Я использую Scrapy для получения HTML-кода. Адрес находится в одном и том же div, я хочу использовать регулярные выражения для дальнейшего разбиения данных на соответствующие разделы. Теперь, как это сделать, я не могу понять.

Edit2:

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

Телефон (или возможный адрес электронной почты или веб-сайт):

((1[-. ])?[0-9]{3}[-. ])?\(?([0-9]{3}[-. ][A?([0-9]{4})|([\w\.-]+@[\w\.-]+)|(www.+)|([\w\.-]*(?:com|net|org|us))

скобки:

\((.*?)\)

Я не уверен, как использовать их для построения утверждения "все, но не эти".

Ответы [ 3 ]

1 голос
/ 03 октября 2011

Это попытка выделить две последние строки из строки:

>>> s="""256-555-5555<br/>
... 1234 Fake Ave S<br/>
... Gotham (Lower Ward)<br/>
... """
>>> m = re.search(r'((?!</br>).*)<br/>\n((?!</br>).*)<br/>$)', s)
>>> print m.group(1)
1234 Fake Ave S

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

1 голос
/ 03 октября 2011

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

  • HTML-теги (<br>)
  • номера телефонов
  • все в скобках

Каждое из которых можно легко сопоставить с помощью простых регулярных выражений, что упрощает создание одного из них, чтобы соответствовать остальным (предположительно - адрес)

0 голосов
/ 03 октября 2011

Насколько я понял вашу проблему, я думаю, что вы выбираете неправильный способ ее решения.

Регулярные выражения не являются магическим инструментом, который может извлекать соответствующие данные из целой массы и беспорядочных недифференцированных элементов текста.,Это инструмент, который может извлекать только данные из текста, имеющего переменные части, но также и минимум стабильной структуры, выступающей в качестве якорей, относительно которых можно локализовать переменные части.

При вашем лечении мне кажется, что вы сначала изолировали эту часть, содержащую возможный номер телефона, а затем адрес в 1/2 строки.Но при этом вы потеряли информацию: что до и после - это привязка информации, вы не должны пытаться найти что-то в оставшемся разделе, полученном после удаления этой информации.

Более того, я предполагаю, что выне хотите только узнать номер телефона и адрес: вы можете извлечь другие фрагменты информации, лежащие до и после этого раздела.С помощью регулярного регулярного выражения вы можете захватить все фрагменты за один снимок.

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

...