Regex findall输出不符合预期

2024-05-15 09:13:38 发布

您现在位置:Python中文网/ 问答频道 /正文

尝试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行的输出

“匹配项是['Receive:<;-AI(Req']”

“最后一行的列表为空,即[]”

“我的期望是['★Err:subargs[0]']或一些文本的列表。”

我怀疑这可能是由于文本中的黑星,因为这些地方的代码片段失败,但不完全确定为什么会发生。你知道吗

如果我能得到一些关于这个的信息,如果我需要修改我的正则表达式,那就太好了。你知道吗


Tags: 代码文本列表islinereqairegex
1条回答
网友
1楼 · 发布于 2024-05-15 09:13:38

最后一行不匹配的原因是最后一行之后没有换行符。你知道吗

如果要保持当前模式,可以断言字符串的结尾$

你的代码可能看起来像

regex = r"\[.{23}] ?(.{1,8}:.{1,12}).*$"

Regex demo

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

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

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

Regex demo

相关问题 更多 >