【发布时间】:2021-10-11 16:53:36
【问题描述】:
我有一个几千行的错误日志,我想匹配所有这些类型的出现:
Traceback (most recent call last):
File "my_code.py", line 83, in upload_detection_image
put_response = s3_object.put(Body=image, ContentType="image/jpeg")
File "/usr/local/lib/python3.6/dist-packages/boto3/resources/factory.py", line 520, in do_action
response = action(self, *args, **kwargs)
File "/usr/local/lib/python3.6/dist-packages/boto3/resources/action.py", line 83, in __call__
response = getattr(parent.meta.client, operation_name)(*args, **params)
File "/usr/local/lib/python3.6/dist-packages/botocore/client.py", line 357, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/usr/local/lib/python3.6/dist-packages/botocore/client.py", line 676, in _make_api_call
raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (ExpiredToken) when calling the PutObject operation: The provided token has expired.
一般来说,我想匹配一些以给定字符串开头并以另一个字符串结尾的文本。文本可以是多行的。问题是文本的开头和结尾可能包含一些可能需要转义的专用正则表达式字符。 我的尝试:
pattern = rf"Traceback(.*){re.escape('botocore.exceptions.ClientError: An error occurred (ExpiredToken) when calling the PutObject operation: The provided token has expired.')}",
re.findall(pattern, text, flags=re.MULTILINE)
它在findall 上给了我错误:
Traceback (most recent call last):
File "/Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/_pydevd_bundle/pydevd_exec2.py", line 3, in Exec
exec(exp, global_vars, local_vars)
File "<string>", line 2, in <module>
File "/Users/me/.pyenv/versions/3.6.12/lib/python3.6/re.py", line 222, in findall
return _compile(pattern, flags).findall(string)
File "/Users/me/.pyenv/versions/3.6.12/lib/python3.6/re.py", line 300, in _compile
raise TypeError("first argument must be string or compiled pattern")
TypeError: first argument must be string or compiled pattern
谢谢
【问题讨论】:
-
将错误的完整回溯显示为问题中格式正确的文本。
-
无关:我怀疑你想要
re.DOTALL,而不是re.MULTILINE。 -
并使用
.*?使其不贪婪。 -
错字:在指定
pattern的行末尾有一个逗号。这使它成为一个字符串的元组插入。 -
所有这些都有助于最终答案。有没有办法避免嵌套组?否则我会有一个基本上匹配所有文件的匹配
标签: python escaping multiline python-re