我正在尝试查找以下行中紧跟在'%‘后面的单词:
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.发布于 2020-03-16 03:46:27
正则表达式中的重复(*和+)默认为“贪婪”模式:它们尝试匹配最长的文本。在您提供的失败案例中,消息中要匹配的单词后面还有额外的冒号(:),因此贪婪的星号*将它们全部匹配。
您可以将行为更改为“惰性”(或“非贪婪”),方法是在重复之后添加问号(?),将其更改为:
result = re.search(r"\%.*? \: ", txt)查看结果here。有关更多信息,请考虑阅读this article。
发布于 2020-03-16 03:47:52
您需要的是一个百分号后跟一个或多个非空格:
re.search("%\S+", s)
#<_sre.SRE_Match object; span=(52, 84), match='%FABRIC-NPU_DRVR-1-PACIFIC_ERROR'>发布于 2020-03-16 03:49:10
您可以使用:
re.search(r'%([^\s]+)', s).group(1)输出(针对regex失败的行进行测试):
FABRIC-NPU_DRVR-1-PACIFIC_ERROR或者您可以使用:
re.search(r'%(\S+)', s).group(1) # \S is the same with [^\s]https://stackoverflow.com/questions/60696888
复制相似问题