正则表达式捕获选定行中的组

时间:2017-10-24 12:47:52

标签: regex python-2.7

我在下面有多行字符串(在python中),并寻找正则表达式来提取 src,dst和严重性。所以在下面的例子中,group1是'10 .4.180.5',第2组'34 .23.21.10'和第3组'关键'

    src: 10.4.180.25
    dst: 34.23.21.10
    natsrc: 20.160.129.5
    natdst: 34.33.21.10
... more lines
    severity: critical
... more lines

如果我尝试像 / src那样的正则表达式:(\ b \ d {1,3}。\ d {1,3}。\ d {1,3}。\ d {1,3} \ b )\ ndst:(\ b \ d {1,3}。\ d {1,3}。\ d {1,3}。\ d {1,3} \ b)\ n / 与gm标志它会找到我 src和dst但不是严重性这是几行向下(为清楚起见省略了行)。有没有办法在不包括src,dst和severity之间的所有这些行的情况下执行此操作?

2 个答案:

答案 0 :(得分:3)

在模式匹配后,您错过了实际匹配任何不以severity开头的行数。此外,您可以使用{3}限制量词来缩短模式,以便不重复\.\d{1,3}这么多次。注意,在空白和数字之间,单词边界是隐式的,它已经存在,不需要使用\b

使用

src:\s*(\d{1,3}(?:\.\d{1,3}){3})\ndst:\s*(\d{1,3}(?:\.\d{1,3}){3})(?:\n(?!severity).+)*?\nseverity:\s*(.+)

请参阅regex demo

<强>详情

  • src: - 文字子字符串
  • \s* - 0+ whitespaces
  • (\d{1,3}(?:\.\d{1,3}){3}) - 第1组:类似IP的模式
  • \n - 换行符
  • dst:\s* - dst:后面有0 +空格
  • (\d{1,3}(?:\.\d{1,3}){3}) - 第1组:类似IP的模式
  • (?:\n(?!severity).+)*? - 0+序列(尽可能少)
    • \n(?!severity) - 未跟severity
    • 的换行符
    • .+ - 整行
  • \nseverity:\s* - 换行符,severity:子字符串和0+空格
  • (.+) - 第3组:直到行尾的1个或多个字符

请注意,此正则表达式不需要任何DOTALL修饰符。

答案 1 :(得分:2)

您可以使用greedy查找(认为这是正确的术语)regex来执行此操作:

src: (\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})\ndst: (\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})[\s\S]*?severity: (.+)?\n

我更新了regex,所以它现在确实有用了!

所以searches对于您所拥有的相同位,但是因为lines行和dst:行之间有很多severity,我们需要跳过所有这些行。

要匹配以severity:开头的任意行数,我们需要匹配任何characters - ,包括新行。为此,我们可以使用一组字符:[\s\S]。这意味着匹配任何不是空格或空格的字符,即所有字符。然后我们将其放在greedy查找中,以匹配到达severity:行所需的任何字符 - 所以此位为[\s\S]*?severity:

现在我们在severity:行,我们希望matchreturn字符一直到该行的末尾(直到新行\n字符)。这是使用类似的(.+)?\n语法完成的,但我们要使用plus来匹配一个或多个字符。此外,由于想要返回此位,我们需要将其放在括号中。