如何仅使用正则表达式匹配第一次出现

时间:2016-08-10 04:14:01

标签: regex

我有这个自定义日志事件,其中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行)而不是第二次出现(即最后一行)?

2 个答案:

答案 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.findallre.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:.*)/

demo

这是有效的,因为默认情况下,.*令牌与新行字符不匹配。由于您的Severity个商家信息在多行上,因此只有第一行匹配。

相关问题