尝试使用正则表达式提取从 .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(Req']”
“对于最后一行,列表为空,即 [ ]”
“我的期望是 ['★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})
关于python - 正则表达式 findall 输出不符合预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57090027/