大佬教程收集整理的这篇文章主要介绍了如何从 Traceback 中提取任何特定的错误消息?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
test_str = """TraceBACk (most recent call last):
file "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/unittest/case.py",line 59,in testPartExecutor
yIEld
file "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/unittest/case.py",line 593,in run
self._callTestMethod(testMethod)
file "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/unittest/case.py",line 550,in _callTestMethod
method()
file "/Users/abcd/efgh/ijkl/bin/../tests/abd/dummy/dummy1.py",line 95,in test_abc
assert false,"FAIliNG FOR A REASON"
AssertionError: FAIliNG FOR A REASON """
last_line = test_str.split("\n")[-1]
print(last_line.split(":")[-1])
@H_607_2@如何使用正则表达式实现相同的效果?
它可以包含任何类型的错误,AssertionError,AttributeError,TypeError,SyntaxError
等。
print(re.split(":",last_line,1)[-1])
@H_607_2@也许更有用一些,
@H_548_5@matched = re.match(r'^\s*([^:\s]+):(.*)',last_linE) if matched: error,message = matched.groups()@H_607_2@
\s
匹配任何空白字符,*
表示重复零次或多次; [^:\s]
匹配任何不是空格或冒号的字符,我们在第一个冒号之前重复这个。
@H_607_2@用稍微高级一点的术语来说,这会在第一段非空格(和非冒号)字符之后找到一个包含冒号的行,并将冒号之前的标记及其之后的所有内容提取为两个单独的组。 (第二组也将包含冒号后的任何空格;可以在左括号前添加 \s*
以修剪任何前导空格。)
@H_607_2@但同样,如果您可以在没有正则表达式的情况下执行此操作,请执行此操作;使用一个只会让这变得更慢和更复杂。
@H_607_2@如果您想从一段较长的文本中提取回溯,请尝试
re.match(r''''^TraceBACk \(most recent call last\):
(?: File "[^\n]+",line \d+,in [^\n]+
[\n]+
)*([^:]+):([^\n]+)''',many_lines,re.MULTILINE)
@H_607_2@但这是未经测试的,可能需要一些修改才能处理与您共享的示例不同的示例(特别是,不在文件中的代码中的错误看起来略有不同;但我也注意到您的示例回溯看起来不像标准的,因为间距模式略有不同 - 此正则表达式针对标准格式)。
@H_607_2@也许注意到我们如何使用一个 '''...'''
三引号字符串将文字换行符嵌入到正则表达式中;我们仍然使用 r
符号将其标记为原始字符串,这样我们就不必将所有反斜杠加倍。
@H_607_2@re.MULTILINE
标志是一个修饰符,它改变了 ^
锚的含义;有标志,它匹配任何行的开头(而没有标志,它只匹配输入字符串的开头)。
,
@H_607_2@您可以匹配第一行,然后是所有不以 TraceBACk 或以 Error 结尾的单词开头的行,以防止过度匹配。
^TraceBACk \(most recent call last\):(?:\r?\n(?![^\S\r\n]*(?:TraceBACk|\w*Error)\b).*)*\r?\n[^\S\r\n]*(\w*Error:.*)
^
字符串开头
@H_673_68@
TraceBACk \(most recent call last\):
匹配 TraceBACk (most recent call last):
@H_673_68@
(?:
非捕获组
\r?\n
匹配换行符
@H_673_68@
(?![^\S\r\n]*(?:TraceBACk|\w*Error)\b)
断言该行不以 TraceBACk
开头或以 Error
结尾的单词
@H_673_68@
.*
匹配整行
)*
关闭非捕获组并重复 0 次以上
@H_673_68@
\r?\n[^\S\r\n]*
匹配换行符,可选的空白字符不带换行符
@H_673_68@
(\w*Error:.*)
捕获组 1,匹配可选单词字符和 Error:
后跟该行的其余部分
import re
test_str = """TraceBACk (most recent call last):
File "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/unittest/case.py",line 59,in testPartExecutor
yield
File "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/unittest/case.py",line 593,in run
self._callTestMethod(testMethod)
File "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/unittest/case.py",line 550,in _callTestMethod
method()
File "/Users/abcd/efgh/ijkl/bin/../tests/abd/dummy/dummy1.py",line 95,in test_abc
assert false,"FAILING FOR A REASON"
AssertionError: FAILING FOR A REASON """
pattern = r"^TraceBACk \(most recent call last\):(?:\r?\n(?![^\S\r\n]*(?:TraceBACk|\w*Error)\b).*)*\r?\n[^\S\r\n]*(\w*Error:.*)"
match = re.match(pattern,test_str)
if match:
print(match.group(1))
@H_607_2@输出
['AssertionError: FAILING FOR A REASON ']
@H_607_2@Python demo
,
import re
test_str = """TraceBACk (most recent call last):
File "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/unittest/case.py","FAILING FOR A REASON"
AssertionError: FAILING FOR A REASON """
match = re.search(r'(?<=Error:.)(.*)(?=.$)',test_str)
print(match.group(1))
# FAILING FOR A REASON
以上是大佬教程为你收集整理的如何从 Traceback 中提取任何特定的错误消息?全部内容,希望文章能够帮你解决如何从 Traceback 中提取任何特定的错误消息?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。