Как извлечь информацию из следующего текста? - PullRequest
0 голосов
/ 22 марта 2020

Я пытаюсь извлечь заголовок, описание и адрес из текста различных веб-сайтов. В настоящее время я занимаюсь поиском в Интернете, который извлекает информацию, указанную выше. Однако у меня возникают проблемы при создании регулярного выражения, соответствующего ожидаемому текстовому выводу, который я хочу получить ниже.

Могу ли я узнать, как улучшить свое регулярное выражение и встроить предлагаемый набор правил чтобы встретить и извлечь информацию выше?

My Regex:

(^.+\n)(^.+\n)?(^\d+.*\d{6})

Набор правил для встраивания:

First line (title)
    - can contain any alphabets and numbers
    - should not contain dot(.)
Second line (description or additonal information)
    - can contain any alphabets and numbers
    - should contain dot(.)
    - second line can be empty
    - if its empty then extract the first line which is the title
Third line (address)
    - address extraction

Ввод текста:

View store information
TAMPINES MART
11559.33Km Away,
5 TAMPINES ST 32, #01-07/16 TAMPINESS MART, 529284
67817232
Open Now
Full Menu
View store information
THE SIGNATURE
The SIGNATURE is a wonderful destination for shopping text.
51, CHANGI BUSINESS PARK CENTRAL 2, #01-15, THE SIGNATURE, 486066
65883667
Open Now
Full Menu
Jewel Changi Airport
Jewel Changi Airport is a breath-taking place for families text.
78 Airport Boulevard, #B2-275-277 Jewel Changi Airport, Singapore, 819666

Ожидаемый вывод текста: (в идеале)

TAMPINES MART
11559.33Km Away,
5 TAMPINES ST 32, #01-07/16 TAMPINESS MART, 529284

THE SIGNATURE
11559.97Km Away,
51, CHANGI BUSINESS PARK CENTRAL 2, #01-15, THE SIGNATURE, 486066

Jewel Changi Airport
78 Airport Boulevard, #B2-275-277 Jewel Changi Airport, Singapore, 819666

1 Ответ

1 голос
/ 22 марта 2020

Один из вариантов - сопоставить слова с помощью \w и повторить первую группу захвата, чтобы получить в качестве заголовка значение последней итерации.

^(\w+(?: \w+)*\r?\n)*(?:(?![^.\r\n]*\.|.*\d{6}).*\r?\n)*(?:([^\r\n.]*\..*(?:\r?\n(?!.* \d{6}).*)*)\r?\n)?(.* \d{6}(?:\r?\n(?![A-Z]).*)*)$

Regex demo

const regex = /^(\w+(?: \w+)*\r?\n)*(?:(?![^.\r\n]*\.|.*\d{6}).*\r?\n)*(?:([^\r\n.]*\..*(?:\r?\n(?!.* \d{6}).*)*)\r?\n)?(.* \d{6}(?:\r?\n(?![A-Z]).*)*)$/mg;
const str = `View store information
TAMPINES MART
11559.33Km Away,
5 TAMPINES ST 32, #01-07/16 TAMPINESS MART, 529284
67817232
Open Now
Full Menu
View store information
THE SIGNATURE
The SIGNATURE is a wonderful destination for shopping text.
51, CHANGI BUSINESS PARK CENTRAL 2, #01-15, THE SIGNATURE, 486066
65883667
Open Now
Full Menu
Jewel Changi Airport
Jewel Changi Airport is a breath-taking place for families text.
78 Airport Boulevard, #B2-275-277 Jewel Changi Airport, Singapore, 819666`;
let m;

while ((m = regex.exec(str)) !== null) {
  // This is necessary to avoid infinite loops with zero-width matches
  if (m.index === regex.lastIndex) {
    regex.lastIndex++;
  }

  console.log("Title: " + m[1]);
  if (undefined !== m[2]) {
    console.log("Description: " + m[2]);
  }
  console.log("Address: " + m[3]);
  console.log("\n")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...