使用正则表达式查找紧跟在字符后面的单词

2024-07-03 08:06:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在下一行中查找紧跟“%”之后的单词:

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()

here是结果:

但是,我的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.

Tags: resulta0单词rpfebutclcmajor
3条回答

正则表达式中的重复(*+)默认为“贪婪”模式:它们尝试匹配最长的文本。在您提供的失败案例中,消息中要匹配的单词后面还有其他冒号(:),因此贪婪的星号*将它们全部匹配

您可以通过在重复后添加问号(?)将行为更改为“懒惰”(或“非贪婪”),将其更改为:

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

查看结果here。有关更多信息,请考虑阅读this article

您需要的是一个百分号,后跟一个或多个非空格:

re.search("%\S+", s)
#<_sre.SRE_Match object; span=(52, 84), match='%FABRIC-NPU_DRVR-1-PACIFIC_ERROR'>

您可以使用:

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]

相关问题 更多 >