【问题标题】:How to match only first occurrence using Regex如何使用正则表达式仅匹配第一次出现
【发布时间】:2016-08-10 12:34:13
【问题描述】:

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

【问题讨论】:

  • 您需要缩小您的问题范围,并且不要使用所有可能的语言进行标记。 -1
  • 您的(Severity:)(.*) 模式已经有效,您接受了具有相同解决方案的答案。使用修饰符完全取决于正则表达式的风格,没有指明。

标签: regex


【解决方案1】:

根据您的问题,尚不清楚您在哪个上下文中使用正则表达式(您标记了 PHP 和 Python),但在 PHP 中,这很简单:

/(Severity:.*)/

demo

这是因为默认情况下,.* 标记不匹配换行符。由于您的 Severity 列表位于多行中,因此只有第一行匹配。

【讨论】:

  • 感谢您的回答,我正在使用regexr.com 匹配这两个事件。
  • @Prime 仅当您离开全局标志时,您才会看到两个匹配项,例如我的答案中没有的 /.../g。在 RegExr 上,您需要删除该标志(右上角的标志选项)来测试我的解决方案。
【解决方案2】:

在 Python 中,re.search:

扫描字符串,寻找正则表达式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',)
>>>

【讨论】:

    猜你喜欢
    • 2018-06-28
    • 2016-03-18
    • 2015-03-15
    • 2022-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    相关资源
    最近更新 更多