Регулярное выражение: соответствует нескольким словам, но ничего до | в | в

Я пытаюсь определить названия дорог в строке для тегов 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».

Я пытался использовать отрицательный взгляд назад, но не смог заставить его работать. Я видел этот отвечать, но он не подходит для моего использования.

Вы можете получить название улицы, а затем использовать /\w+(?=\s+street)(.)*.

Alias Cartellano 17.03.2022 22:39
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ты можешь использовать:

(?<!\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'
]

Спасибо за добавление в объяснение, это облегчает понимание, действительно полезно

Jonno Bourne 21.03.2022 18:32

Другие вопросы по теме