Как вернуть значение номера дома на основе заданного номера дома и почтового индекса - PullRequest
0 голосов
/ 30 октября 2019

Пожалуйста, посмотрите на текстовый пример ниже

Company X
                                               Fakestreet 97,
This an invoice. Please pay :)                 3000 AB Fakecity

Я работаю над шаблоном регулярных выражений (в R), который возвращает строку текста из соответствующего номера дома (97)для совпадения с указанным почтовым индексом (3000 AB) соответствует . На практике между почтовым индексом и номером дома всегда есть пробелы, разрывы (строки) и другие символы.

Мой текущий шаблон для этого соответствия:

\\b(97){1}\\b((.|\r\n|\r|\n|))*(3000 AB)

Я хочу тольковернуть текст из совпадения с номером « 97 » из «fakestreet» до совпадения с почтовым индексом. Но только в том случае, если данный почтовый индекс также совпадает (3000 AB). В

Как должен выглядеть мой рисунок? Моя текущая модель вызывает у меня проблемы:

Она «продолжается» бесконечно и не остановится. Вероятно, это связано с шаблоном ((.|\r\n|\r|\n|))+.

Мой текущий шаблон для этого соответствия:

\\b(97){1}\\b((.|\r\n|\r|\n|))*(3000 AB)

Разбивка 'логики'

поиск и сравнениепочтовый индекс

  • (3000 АБ)

Найдите конкретный соответствующий номер дома (и никакого другого номера), одинарный и окруженный границами слов

  • \\b(97){1}\\b

'соединить' пробелы между почтовым индексом и найденным номером дома. Прямо сейчас это возвращает все совпадающие символы.

  • ((.|\r\n|\r|\n|))*

Любая помощь очень ценится!

1 Ответ

0 голосов
/ 30 октября 2019

С вашим уточненным вопросом должно сработать следующее, но я не уверен, что результат полезен:

\b97\b.*?3000 AB

Ключом к выполнению этой работы является принудительное приведение . в соответствие с символами новой строки. ,С пакетом stringr это можно сделать, указав dotall = TRUE:

str_match(text, regex('\\b97\\b.*?3000 AB', dotall = TRUE))
#      [,1]
# [1,] "97,\nThis an invoice. Please pay :)                 3000 AB"

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

В базе R это работает даже без дополнительных флагов:

regmatches(x, gregexpr('\\b97\\b.*?3000 AB', x))
# [[1]]
# [1] "97,\nThis an invoice. Please pay :)                 3000 AB"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...