组之间的捕获字符串,组不是固定的(RegEx)

h5qlskok  于 2023-03-24  发布在  其他
关注(0)|答案(3)|浏览(128)

我试图捕获两组字符串之间的一组字符串。RegEx基本上可以工作,但当模式发生变化时,它不能捕获所有字符串。
字符串为:

2023-03-20 / 10:56:58 4737 Security-Enabled Global Group Modified 73 high SRVDC2 john.smi.admin 10.7.3.252 1

在日期和时间之后是一个四位数的数字,有时不存在,所以日志显示N/A。这就是我遇到麻烦的时候。RegEx必须能够捕获四位数和N/A消息。
以下是我的尝试:

import re
string = '2023-03-20 / 10:56:58 4737 Security-Enabled Global Group Modified 73 high SRVDC2 john.smi.admin 10.7.3.252 1'
pattern = '(?<=\d{4} )(.*?)(?=\s\d{2}\s)'
res = re.findall(pattern,string,re.MULTILINE)
print(res)
omhiaaxx

omhiaaxx1#

您可以使用|(或)合并两个lookbehind。

pattern = r'(?:(?<=\d{4} )|(?<=N/A ))(.*?)(?=\s\d{2}\s)'
o2g1uqev

o2g1uqev2#

请改用'(?<=\d{4} | N/A )(.*?)(?=\s\d{2}\s)'
它向后查找4位数字和空格或空格之间的N/A。这是保持向后查找组固定长度所必需的。

ylamdve6

ylamdve63#

你不需要使用任何lookarounds,你可以匹配然后使用capture group 1值:

\b(?:\d{4}|N/A)\s+(.*?)\s+\d\d\s

说明

  • \b防止部分字匹配的字边界
  • (?:\d{4}|N/A)匹配4位数字或N/A
  • \s+匹配1+空格字符
  • (.*?)捕获组1,匹配除换行符外的任意字符,尽量少匹配
  • \s+\d\d\s匹配1+个空格字符、2个数字和一个空格字符

参见regex demo

相关问题