我在下面有多行字符串(在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之间的所有这些行的情况下执行此操作?
答案 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:
行,我们希望match
和return
字符一直到该行的末尾(直到新行\n
字符)。这是使用类似的(.+)?\n
语法完成的,但我们要使用plus
来匹配一个或多个字符。此外,由于想要返回此位,我们需要将其放在括号中。