Сопоставление в регулярном выражении всех заглавных слов между двумя словами - PullRequest
2 голосов
/ 31 марта 2020

Я создаю парсер текста. Текст содержит два конкретных c слова, которые я не хочу сопоставлять, и между ними я хочу охватить все существующие заглавные слова.

Например, текст будет выглядеть так:

Treatments: IBUPROFEN\n\xe2\x80\xa2 COLCHICINE .... Physical examination

Я пытался с этим (?<=Treatments)(?:.*?)(\b[A-Z]+\b)(?:.*?)(?=Physical), но он не работал.

Я хотел бы захватить только слова, которые заглавными буквами между лечением и физическим осмотром

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Чтобы захватить только слова, написанные заглавными буквами и между словами begin и end, используйте это регулярное выражение:

.*begin|end.*|[^e]*?\b([A-Z]{2,})\b

См. Онлайн-демонстрацию

Когда вы заменяете end другим словом, обязательно замените e в [^e]*? части первой буквой этого нового слова, например, если вы хотите заменить end на Stop, тогда также замените [^e]*? на [^S]*?.

Для рассматриваемого примера это регулярное выражение становится следующим:

.*Treatments|Physical examination.*|[^P]*?\b([A-Z]{2,})\b

См. онлайн-демонстрацию

Примечание что вы должны указать своему движку регулярных выражений, чтобы . (точка) соответствовал символу новой строки:

  • В Python это re.DOTALL флаг.
  • В JavaScript вы должны заменить все . (точки) в регулярном выражении на [\s\S]. [ source ]

Также обратите внимание, что первое и последнее совпадения с регулярным выражением не будут иметь ничего в первой группе захвата, поэтому вы должны игнорировать эти совпадения (см. filter вызвать python пример ниже).

Python пример

import re

text = """Suspendisse potenti:
Not MATCHED here. Por TOG esfet.

Treatments:
Pellentesque eget sollicitudin quam, id venenatis odio. Nam non tortor elit. Pras ultricies est urna, eu feugiat purus tempor a. Donec IBUPROFEN feugiat tristique ante, eget vulputate velit rhoncus ut. Morbi MATCHED HERE elementum leo a vulputate cursus. Sed at purus sit amet sapien COLCHICINE ullamcorper convallis.

Physical examination:
Also NOT MATCHED here at TO pulvinar mi, at vehicula libero. Nunc semper, neque sed tempor iaculis, nunc diam egestas lacus, Peget sodales sapien orci eget leo."""
results = re.findall(r".*Treatments|Physical examination.*|[^P]*?\b([A-Z]{2,})\b", text, re.DOTALL)
words = list(filter(None, results))

print(words)

Запустить

0 голосов
/ 31 марта 2020

Кажется, это работает в Java. Вот что используется.

  • ?msd многострочный режим, режим точки и unix режим новой строки
  • \b граница слова (необходимо сделать \\b для Java Строки)
  • (?<=) позитивный взгляд позади
  • (?=) позитивный взгляд вперед.
        String str =
                "Treatments: IBUPROFEN\n\\xe2\\x80\\xa2 COLCHICINE .... Physical examination";

         pat = "(?msd:(?<=Treatments:.*)\\b([A-Z]+)\\b(?=.*Physical examination))";
        // iterate until no matches found.
        Matcher m = Pattern.compile(pat).matcher(str);
        while(m.find()) {
            System.out.println(m.group(1));
        }

Печать

IBUPROFEN
COLCHICINE
...