Skip to main content
 首页 » 编程设计

python之正则表达式 findall 输出不符合预期

2024年11月24日27虾米哥

尝试使用 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}).*$" 

Regex demo

当前模式不考虑时间戳格式,它匹配任何字符的 23 次,除了 [ 和 ] 之间的换行符。

您可能会更新您的模式以匹配您当前的时间戳格式(它不验证时间戳),使用否定字符类 [^:]+: 之后匹配直到 : 并可能在捕获组之后省略匹配:

\[\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}\.\d{3}] ?([^:]+:.{1,12}) 

Regex demo