Я пытаюсь определить названия дорог в строке для тегов span. В строке может быть несколько названий дорог, но чаще всего только одно.
Для большинства дорог формат примерно такой
"flat 14, 24-34 barrington street, London"
"23 the honourable lord barrington's street, London"
"23 the honourable lord barrington's street, 42 the dishonarable baron lordington's street, London"
Их легко захватить, используя базовое регулярное выражение в форме (?<=\s)([a-z'\s])+(street)
или ([a-z']+(\s)?)+(street)(?=,)
.
Однако иногда адрес будет иметь форму
"land to the south of barrington street, London"
"plot 12 on barrington street, London"
Есть несколько ключевых слов, которые почти всегда используются в этой ситуации: «у», «на», «в», «примыкающий».
Я хотел бы создать регулярное выражение, которое может соответствовать нескольким словам, за которыми следует «улица», но не будет соответствовать ни одному из ключевых слов или слов, которые стоят перед ним в предложении. Другими словами, будет извлечено название улицы, но не «участок 12».
Я пытался использовать отрицательный взгляд назад, но не смог заставить его работать. Я видел этот отвечать, но он не подходит для моего использования.
Ты можешь использовать:
(?<!\S)(?:(?!\b(?:at|on|in|adjoining)\b)[^\n\d])*? street\b
Шаблон соответствует:
(?<!\S)
Установите границу пробела слева(?:
Группа без захвата
(?!\b(?:at|on|in|adjoining)\b)
Отменить просмотр вперед, не утверждать ни одно из слов прямо справа[^\n\d]
Соответствует любому символу, кроме цифры или новой строки)*?
Закройте группу без захвата и, при желании, повторите как можно меньше street\b
Совпадение буквально следует за границей слова, чтобы предотвратить частичное совпадениеСм. Демонстрация регулярных выражений и демонстрация Python
Пример кода
import re
pattern = r"(?<!\S)(?:(?!\b(?:at|on|in|adjoining)\b)[^\n\d])*? street\b"
s = ("flat 14, 24-34 barrington street, London\n"
"23 the honourable lord barrington's street, London\n"
"23 the honourable lord barrington's street, 42 the dishonarable baron lordington's street, London\n"
"land to the south of barrington street, London\n"
"plot 12 on barrington street, London")
print(re.findall(pattern, s))
Выход
[
'barrington street',
"the honourable lord barrington's street",
"the honourable lord barrington's street",
"the dishonarable baron lordington's street",
'land to the south of barrington street',
'barrington street'
]
Спасибо за добавление в объяснение, это облегчает понимание, действительно полезно
Вы можете получить название улицы, а затем использовать
/\w+(?=\s+street)(.)*
.