【问题标题】:testfixtures.StringComparison does not allow regex flagstestfixtures.StringComparison 不允许使用正则表达式标志
【发布时间】:2017-11-05 07:49:31
【问题描述】:

我正在尝试捕获日志以用于测试目的,并使用 python 中的testfixtures 模块通过正则表达式匹配它,并通过logging 模块进行日志记录。

这是实际发生的事情的复制品:

import logging, traceback
from testfixtures import LogCapture, StringComparison

exception = None
try:
    raise Exception('test exception')
except Exception as ex:
    exception = ex

traceback_str = '\n'.join(traceback.format_exception(type(exception), exception, exception.__traceback__))

with LogCapture() as capture:
    logging.info(traceback_str)
capture.check(('root', 'INFO', StringComparison(r'.*test exception.*')))

但是这段代码给出了错误并且不匹配。而且我无法将re.DOTALL 标志考虑为正则表达式中的. 作为换行符,因为它在StringComparison 的参数数量上给出错误。

现在,作为一种解决方法,我正在使用以下正则表达式:

capture.check(('root', 'INFO', StringComparison(r'(.*\n)*.*test exception.*'))

有没有其他方法可以提供标志来比较捕获的日志,或者使用不同的功能检查日志?

【问题讨论】:

  • 这是一个第三方模块,不是标准库的一部分;如果您认为它需要一个新功能,请与维护者提出来
  • r'(?s).*test exception.*' 不工作吗?
  • @WiktorStribiżew 它工作正常。谢谢

标签: regex python-3.x logging


【解决方案1】:

您可以使用 内联修饰符 版本 (?s),这等于将 re.DOTALL / re.S 标志传递给正则表达式引擎:

r'(?s).*test exception.*'

参见re 文档:

(?aiLmsux)
'a''i''L''m''s''u''x' 集合中的一个或多个字母。)该组匹配空字符串;这些字母设置了相应的标志:re.A(仅 ASCII 匹配)、re.I(忽略大小写)、re.L(取决于区域设置)、re.M(多行)、re.S(点匹配所有)和re.X(详细),用于整个正则表达式。 (标志在Module Contents 中描述。)如果您希望将标志包含在正则表达式中,而不是将flag 参数传递给re.compile() 函数,这将非常有用。

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多