【问题标题】:Regex: How to ignore dots in connected words正则表达式:如何忽略连接词中的点
【发布时间】:2021-01-10 00:28:32
【问题描述】:

为了分析日志文件,我需要使用 python 和正则表达式提取异常类型。
异常类型始终包含子字符串“Exception”。
问题是子字符串“Exception”并不总是在他们名字的末尾。
此外,异常类型由未知数量的点组成。

预期行为:

输入
“2021 年 8 月 1 日:存在 System.InvalidCalculationException - 系统重新启动”
“2021 年 9 月 1 日:SuperSystem 识别出 System.IO.WritingException 询问用户下一步该做什么”
“2021 年 10 月 1 日:哦,不,不再是 InternalException.NullReference.NonCritical.User,我们应该修复它!”

输出
“System.InvalidCalculationException”
“System.IO.WritingException”
“InternalException.NullReference.NonCritical.User”

正则表达式的外观如何?
对于以“Exception”结尾的异常类型,我已经尝试使用“\w+[.]\w+[.]*Exception”。
但是如果异常类型包含更多的点并且“异常”不在末尾怎么办?

【问题讨论】:

    标签: python python-3.x regex string


    【解决方案1】:

    你可以使用

    \b(?:[A-Za-z]+\.)*[A-Za-z]*Exception(?:\.[A-Za-z]+)*\b
    \b(?:\w+\.)*\w*Exception(?:\.\w+)*\b
    

    请参阅regex demo / regex demo #2。详情:

    • \b - 单词边界
    • (?:[A-Za-z]+\.)* - 一个或多个字母出现零次或多次,后跟一个点
    • [A-Za-z]* - 零个或多个字母
    • Exception - 一个字符串 Exception
    • (?:\.[A-Za-z]+)* - 零次或多次重复一个点,然后是一个或多个字母。
    • \b - 单词边界。

    \w 匹配任何字母、数字或下划线。

    Python 用法:

    re.findall(r'\b(?:\w+\.)*\w*Exception(?:\.\w+)*\b', text)
    

    【讨论】:

    • 您的解决方案总是给出与 Jim Simson 的解决方案相同的结果吗?
    • @NewUbuntuUser 不,有一个look
    【解决方案2】:

    怎么样:

    [^\s]*Exception[^\s]*
    

    (Demo)

    以上内容可确保您的字符串包含“异常”一词,并包含任何在其之前或之后的不是空白字符的内容。

    [^\s]* 匹配任何非 (^) 空格 (\s) 0 到无限次 (*)。

    【讨论】:

      【解决方案3】:

      根据你写的,可以说每个异常都是一串字母和点。

      我认为这可以解决您的问题: "([A-Z][a-z]*.).([^\s]+)"

      查看link

      【讨论】:

      • 能否提供regex101.com的链接?
      • 我编辑了答案,请再次检查答案。我还添加了链接@NewUbuntuUser
      • 不适用于“InternalException.NullReference.NonCritical.User”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 2022-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多