尝试使用正则表达式提取从.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]']或一些文本列表。”
我怀疑这可能是由于文本中的黑星所致,因为在这些地方代码段失败了,但我不确定为什么会发生。
如果我能对此提供一些意见并且需要对我的正则表达式进行更改,那将很棒。
答案 0 :(得分:1)
最后一行不匹配的原因是因为最后一行之后没有换行符。
如果要保留当前模式,可以声明字符串$
的结尾
您的代码可能看起来像
regex = r"\[.{23}] ?(.{1,8}:.{1,12}).*$"
当前模式未考虑时间戳格式,它匹配任何字符的23倍,除了[
和]
之间的换行符。
您可以更新模式以匹配当前的时间戳格式(它不验证时间戳),在之后使用否定的字符类[^:]+:
进行匹配,直到:
,并可能在捕获组:
\[\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}\.\d{3}] ?([^:]+:.{1,12})