【问题标题】:Python re escaping raises TypeError: first argument must be string or compiled patternPython重新转义引发TypeError:第一个参数必须是字符串或编译模式
【发布时间】: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


【解决方案1】:

您所有的 cmets 都对最终解决方案做出了贡献:

pattern = rf"Traceback(.*?){re.escape('botocore.exceptions.ClientError: An error occurred (ExpiredToken) when calling the PutObject operation: The provided token has expired.')}"
results = re.findall(pattern, text, flags=re.DOTALL)

【讨论】:

  • 你认为你为什么需要re.MULTILINE?正则表达式中没有 ^$
  • 对,没必要。我会修复上面的答案。你知道我怎样才能避免正则表达式匹配几乎整个文本吗?我认为有嵌套匹配
  • 你应该使用否定的环视,这样它就不会在匹配中包含Traceback
猜你喜欢
  • 2018-09-14
  • 2018-02-07
  • 1970-01-01
  • 2020-05-05
  • 2019-11-04
  • 2021-12-17
  • 2020-09-11
  • 2018-09-16
  • 1970-01-01
相关资源
最近更新 更多