Возьмите первое слово после совпадения регулярных выражений

#python #regex

#python #регулярное выражение

Вопрос:

Я пытаюсь извлечь некоторую подстроку, используя регулярное выражение, из строки. У меня есть в качестве параметра слово в моей функции, и цель состоит в том, чтобы извлечь самое следующее слово (мое определение word) после этого совпадения. Я пробовал lookbehind и некоторые другие логики, но мне не удалось получить результаты, поэтому приветствуется любая помощь.

В качестве примера, учитывая первый случай, у меня есть входные данные в моей функции: **THttpServer**

 23:25:04.805: INFO: THttpServer: transportTCPChanged(state: DISCONNECTED 2)
23:25:13.120: INFO: THttpServer: transportUDPOpened(state: Port 54)
  

Ожидаемый результат: transportTCPChanged и transportUDPOpened для обоих случаев.

Другой случай, у меня есть в качестве входных данных CurrentUserConnection

 23:25:16.622: INFO: CurrentUserConnection#1:RQ : subscribed(userID: 1)
23:25:16.622: INFO: CurrentUserConnection#8:RP : disconnected
  

Ожидаемый результат: subscribed, disconnected .

Что я пробовал (внешний вид меняется в зависимости от примера) в Notepad :

(?<=THttpServer)(w ) : Нет совпадений (?<=THttpServer)(.*) : Очевидно, возвращает все предложение, не ожидаемое совпадение

Я немного сбит с толку, может быть, это даже невозможно? Или мне нужна некоторая предварительная обработка?

Ответ №1:

Вам нужно сопоставить символы : after THttpServer и любые символы, не являющиеся словом, до слова, а также сопоставить и захватить его с помощью (w ) .

Например. вы можете использовать

 THttpServer:W*(w )
  

Смотрите демонстрацию регулярных выражений.

Подробные сведения

  • THttpServer: — буквенная подстрока
  • W* — любые символы, не содержащие 0 слов
  • (w ) — Захват группы 1 (позже доступной через m.group(1) ): 1 или более символов word.

Смотрите демонстрацию Python:

 import re
strs = ['23:25:04.805: INFO: THttpServer: transportTCPChanged(state: DISCONNECTED 2)',
        '23:25:13.120: INFO: THttpServer: transportUDPOpened(state: Port 54)']

rx = re.compile(r'THttpServer:W*(w )')
for s in strs:
    m = rx.search(s)
    if m:
        print("Found '{}' in '{}'.".format(m.group(1), s))
  

Вывод:

 Found 'transportTCPChanged' in '23:25:04.805: INFO: THttpServer: transportTCPChanged(state: DISCONNECTED 2)'.
Found 'transportUDPOpened' in '23:25:13.120: INFO: THttpServer: transportUDPOpened(state: Port 54)'.
  

Комментарии:

1. Я пытаюсь это сделать, но, по крайней мере, с Notepad это не работает. Мне нравится тестировать его перед внедрением на Python, знаете почему?

2. @AlejandroA Я не знаю, что означает «не работает». Регулярное выражение, которое я предлагаю, одинаково работает в библиотеках регулярных выражений Python re и NPP Boost. Подсказка: всегда проверяйте свои регулярные выражения в совместимых средах. Например, на regex101.com вы можете установить опцию Python и протестировать свои шаблоны там. Он даже генерирует код для вас.

3. это сработало на python, как вы предложили, большое вам спасибо