#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, как вы предложили, большое вам спасибо