Regex 如何使用正则表达式仅匹配第一个匹配项

Regex 如何使用正则表达式仅匹配第一个匹配项,regex,Regex,我有一个自定义日志事件,它在每个事件中重复两次严重性:高。我尝试使用正则表达式只匹配第一个匹配项并删除/替换它。在删除/替换第一个匹配项之前,我尝试选择第一个匹配项,但我的正则表达式与这两个匹配项都匹配 Host: Hostname VServer: NO Version: Oracle v11 Cause: SQL exception Severity: HIGH JDKPath: C:\Program Files\Java\jdk1.7.0\bin Process: 2816 Severi

我有一个自定义日志事件,它在每个事件中重复两次
严重性:高。我尝试使用正则表达式只匹配第一个匹配项并删除/替换它。在删除/替换第一个匹配项之前,我尝试选择第一个匹配项,但我的正则表达式与这两个匹配项都匹配

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
这是我的正则表达式,它匹配出现的
(严重性:)(.*)
(严重性:\s.*)
。如何只匹配第一个匹配项(即第5行)而不匹配第二个匹配项(即最后一行)?

在Python中:

扫描字符串,查找正则表达式模式生成匹配项的第一个位置,并返回相应的
MatchObject
实例。如果字符串中没有与模式匹配的位置,则返回
None
;请注意,这与在字符串中的某个点查找零长度匹配不同

正如你所看到的,只有第一个匹配

相反,如果您使用
re.findall
re.finditer
,则您可以同时获得:

>>> b = re.findall('Severity\: (.*)', log)
>>> b
['HIGH', 'HIGH']
>>>
>>> for f in re.finditer('Severity\: (.*)', log):
...   print f.groups()
...
('HIGH',)
('HIGH',)
>>>
在Python中:

扫描字符串,查找正则表达式模式生成匹配项的第一个位置,并返回相应的
MatchObject
实例。如果字符串中没有与模式匹配的位置,则返回
None
;请注意,这与在字符串中的某个点查找零长度匹配不同

正如你所看到的,只有第一个匹配

相反,如果您使用
re.findall
re.finditer
,则您可以同时获得:

>>> b = re.findall('Severity\: (.*)', log)
>>> b
['HIGH', 'HIGH']
>>>
>>> for f in re.finditer('Severity\: (.*)', log):
...   print f.groups()
...
('HIGH',)
('HIGH',)
>>>

从您的问题来看,不清楚您在哪个上下文中使用正则表达式(您标记了PHP和Python),但在PHP中,它非常简单:

/(Severity:.*)/


这是因为默认情况下,
*
标记与新行字符不匹配。由于您的
严重性
列表在多行中,只有第一行匹配。

从您的问题来看,不清楚您在哪个上下文中使用正则表达式(您标记了PHP和Python),但在PHP中,它非常简单:

/(Severity:.*)/


这是因为默认情况下,
*
标记与新行字符不匹配。由于您的
严重性
列表在多行中,因此只有第一行匹配。

您需要缩小问题范围,并且不要使用所有可能的语言-1您的
(严重性:)(.*)
模式已起作用,您接受了具有相同解决方案的答案。使用修饰语完全取决于正则表达式的风格,没有任何修饰语。你需要缩小你的问题范围,不要用每种可能的语言来标记-1您的
(严重性:)(.*)
模式已起作用,您接受了具有相同解决方案的答案。使用修饰符完全取决于正则表达式的风格,不表示任何修饰符。感谢您的回答,我使用的是匹配两个事件的修饰符。@Prime只有在您离开全局标志时,您才会看到两个匹配项,如
/…/g
,我的回答中没有。在RegExr上,您需要删除该标志(右上角的标志选项)以测试我的解决方案。感谢您的回答,我使用的是匹配两个事件的标志。@Prime只有在您离开全局标志时,您才会看到两个匹配项,如
/…/g
,而我的答案中没有全局标志。在RegExr上,您需要删除该标志(右上角的标志选项)以测试我的解决方案。