尝试使用 Regex 提取从 .txt 文件中读取的部分文本。然而,我的方法似乎在某些特定行上失败了。
下面是输入文本的 3 行
[2019/07/11 18:52:25.391] Receive : <- AI (Req No. 711185105702666 ) Message from : cop10
[2019/07/11 18:52:25.391] Note : Response that is not being sent ... cop10
[2019/07/11 18:52:25.393] ★Err : subargs[0] : IBSDK_7776
下面是提取时间戳后文本部分的代码。
regex = r"\[.{23}] ?(.{1,8}:.{1,12}).*\n"
pattern = re.compile(regex)
for line in input_text:
matches = pattern.findall(line)
print('matches is {}'.format(matches))
“对于输入文本中的第 1 行和第 2 行,输出符合预期,即提取文本的列表。”
下面显示的是第 1 行的输出
“匹配是['接收:<- AI(请求']”
“对于最后一行,列表是空的,即 [ ]”
“我的期望是 ['★Err : subargs[0]'] 或一些文本列表。”
我怀疑这可能是由于文本中的黑星造成的,因为这些是代码片段失败的地方,但我不完全确定为什么会发生这种情况。
如果我能就此获得一些意见并且我需要更改我的正则表达式,那就太好了。
请您参考如下方法:
最后一行没有匹配到的原因是最后一行后面没有换行
如果你想保留你当前的模式,你可以断言字符串的结尾 $
你的代码可能看起来像
regex = r"\[.{23}] ?(.{1,8}:.{1,12}).*$"
当前模式不考虑时间戳格式,它匹配任何字符的 23 次,除了 [ 和 ] 之间的换行符。
您可能会更新您的模式以匹配您当前的时间戳格式(它不验证时间戳),使用否定字符类 [^:]+: 之后匹配直到 : 并可能在捕获组之后省略匹配:
\[\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}\.\d{3}] ?([^:]+:.{1,12})
