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

时间:2019-07-18 08:17:39

标签: 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]']或一些文本列表。”

我怀疑这可能是由于文本中的黑星所致,因为在这些地方代码段失败了,但我不确定为什么会发生。

如果我能对此提供一些意见并且需要对我的正则表达式进行更改,那将很棒。

1 个答案:

答案 0 :(得分:1)

最后一行不匹配的原因是因为最后一行之后没有换行符。

如果要保留当前模式,可以声明字符串$的结尾

您的代码可能看起来像

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