Поиск слова сразу после символа с регулярным выражением - PullRequest
1 голос
/ 15 марта 2020

Я пытаюсь найти слово, которое находится сразу после '%' в следующей строке:

RP/0/RP0/CPU0:Feb 26 20:04:01.869 UTC: esd[361]: %PKT_INFRA-FM-3-FAULT_MAJOR : ALARM_MAJOR :SWITCH_LINK_ERR_E :DECLARE :0/RP0/CPU0/7:

LC/0/9/CPU0:Feb 26 20:00:25.560 UTC: npu_drvr[253]: %PLATFORM-OFA-6-INFO : NPU #1 Initialization Completed

Для начала я использовал следующий код Python, и он работает.

result = re.search(r"\%.* \: ", txt)
result.group()

И здесь - это результат:

Однако мой reg ex терпит неудачу в таких строках:

LC/0/9/CPU0:Feb 27 15:33:58.509 UTC: npu_drvr[253]: %FABRIC-NPU_DRVR-1-PACIFIC_ERROR : [5821] : [PACIFIC A0]: For asic 0 : A0 Errata: Observed RX CODE errors on link 120 , This is expected if you have A0 asic versions in the system and do triggers like OIR, reload etc.

Ответы [ 4 ]

2 голосов
/ 15 марта 2020

Повторения (* и +) в регулярных выражениях по умолчанию устанавливаются в «жадный» режим: они пытаются сопоставить самый длинный фрагмент текста. В указанном вами случае сбоя в сообщении есть дополнительные двоеточия (:) после слова для сопоставления, поэтому жадная звезда * совпала со всеми ними.

Вы можете изменить поведение на "lazy" "(или" не жадный "), добавив знак вопроса (?) после повторения, изменив его на:

result = re.search(r"\%.*? \: ", txt)

Проверьте результаты здесь . Для получения дополнительной информации, прочитайте эту статью .

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

вы можете использовать:

re.search(r'%([^\s]+)', s).group(1)

выход (проверено по линии, для которой не выполняется ваше регулярное выражение):

FABRIC-NPU_DRVR-1-PACIFIC_ERROR

или вы можете использовать:

 re.search(r'%(\S+)', s).group(1) # \S is the same with [^\s]
1 голос
/ 15 марта 2020

То, что вы хотите, это знак процента, за которым следует один или несколько не пробелов:

re.search("%\S+", s)
#<_sre.SRE_Match object; span=(52, 84), match='%FABRIC-NPU_DRVR-1-PACIFIC_ERROR'>
0 голосов
/ 15 марта 2020

Попробуйте:

import re

x="LC/0/9/CPU0:Feb 27 15:33:58.509 UTC: npu_drvr[253]: %FABRIC-NPU_DRVR-1-PACIFIC_ERROR : [5821] : [PACIFIC A0]: For asic 0 : A0 Errata: Observed RX CODE errors on link 120 , This is expected if you have A0 asic versions in the system and do triggers like OIR, reload etc."

res=re.findall(r"(?<=%)[^\s]+", x)

Выходы:

>>> res

['FABRIC-NPU_DRVR-1-PACIFIC_ERROR']

(?<=%)[^\s]+ - первые скобки будут совпадать, только если % предшествует вторым скобкам, без фактического возврата %. Следующие скобки соответствуют только слову, то есть строке, состоящей из 1 или более символов, которые не являются пробелами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...