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

标签 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 行的输出

“匹配是['接收:<- AI(Req']”

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

“我的期望是 ['★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

关于python - 正则表达式 findall 输出不符合预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57090027/

相关文章:

python - 如何将 RGBA 字节串转换为灰度图像?

python - Docker 撰写脚本提示 python 模块导入

python - 将数据帧转换为元组列表

python - 奇怪的文件查找行为

c# - 如何修复 BBcode 正则表达式

regex - 正则表达式并忽略空格

python - 如何在 EOF 之前读取用户输入?

Javascript Cookies 通过正则表达式名称获取

regex - 十进制或空白的正则表达式

python - 正则表达式捕捉网址