我有这个自定义日志事件,其中Severity: HIGH
在每个事件中重复两次。我尝试使用正则表达式仅匹配第一个匹配项并删除/替换它。在删除/替换第一个匹配之前,我尝试选择第一个匹配,但我的正则表达式匹配两个匹配项。
Host: Hostname
VServer: NO
Version: Oracle v11
Cause: SQL exception
Severity: HIGH
JDKPath: C:\Program Files\Java\jdk1.7.0\bin
Process: 2816
Severity: HIGH
这是我的正则表达式,它匹配事件(Severity:)(.*)
或(Severity:\s.*)
。如何仅匹配第一次出现(即第5行)而不是第二次出现(即最后一行)?
答案 0 :(得分:1)
在Python中,re.search
:
扫描 string ,查找正则表达式 pattern 生成匹配项的第一个位置,并返回相应的
MatchObject
实例。如果字符串中没有位置与模式匹配,则返回None
;请注意,这与在字符串中的某个点找到零长度匹配不同。
>>> import re
>>>
>>> log = """Host: Hostname
... VServer: NO
... Version: Oracle v11
... Cause: SQL exception
... Severity: HIGH
... JDKPath: C:\Program Files\Java\jdk1.7.0\bin
... Process: 2816
... Severity: HIGH"""
>>>
>>> m = re.search('Severity\: (.*)', log)
>>> m.groups()
('HIGH',)
如您所见,只有第一个匹配。
相反,如果您使用re.findall
或re.finditer
,那么您同时获得两者:
>>> b = re.findall('Severity\: (.*)', log)
>>> b
['HIGH', 'HIGH']
>>>
>>> for f in re.finditer('Severity\: (.*)', log):
... print f.groups()
...
('HIGH',)
('HIGH',)
>>>
答案 1 :(得分:1)
从您的问题来看,目前尚不清楚您在哪个环境中使用Regex(您标记了PHP和Python),但在PHP中,它非常简单:
/(Severity:.*)/
这是有效的,因为默认情况下,.*
令牌与新行字符不匹配。由于您的Severity
个商家信息在多行上,因此只有第一行匹配。