【问题标题】:regex - negative expression matching正则表达式 - 否定表达式匹配
【发布时间】:2021-10-02 18:33:04
【问题描述】:

问题介绍

所以我一直在努力尝试消极地看待工作前后的事情。对于最后一个示例输入,我当前的解决方案不返回匹配项(请参阅预期输出表)。我正在努力解决如何匹配字符串的title 部分,因为它包含不在字符串末尾的年份。需要明确的是,我只对匹配位于字符串末尾的year 感兴趣。当前正则表达式在最后一个示例中失败,因为它匹配 title 中的 NOT("Q" OR "\d*")。但是,我只希望它匹配NOT("Q" AND "\d{1}")。非常感谢任何提示/建议。注意使用 Python 3.8。

输入示例

AXP - Earnings call Q2 2021
AXP - Conference call 2021
BAC,BAC.PE,BAC.PL,BACRP,BML.PL,BML.PJ,BML.PH,BML.PG,BAC.PB,BAC.PK,BAC.PM,BAC.PN - Earnings call Q2 2021
GM - General Motors Company (GM) Presents at Deutsche Bank AutoTech Conference
AXP - American Express Company (AXP) Management Presents at Barclays 2020 Global Financial Services Conference

period 将始终采用 Q[1-4] 的形式。 periodyear 是可选的。如果它们确实发生,它们将位于字符串的末尾。 symboltitle 始终由 - 分隔并始终出现。

预期输出

symbol title period year
AXP Earnings call Q2 2021
AXP Conference call 2021
BAC Earnings call Q2 2021
GM General Motors Company (GM) Presents at Deutsche Bank AutoTech Conference
AXP American Express Company (AXP) Management Presents at Barclays 2020 Global Financial Services Conference

我的尝试

r"^(?P<symbol>[^\,]{1,8})(\,[A-Z\.]+)*\s\-\s(?P<title>[^Q\d]*)\s?(?P<period>Q\d)?\s?(?P<year>19|20\d{2})$"

【问题讨论】:

    标签: python regex regex-negation


    【解决方案1】:

    你可以使用

    ^(?P<symbol>[^,]{1,8})(?:,[A-Z.]*)*\s+-\s+(?P<title>(?:(?!Q\d).)*?)\s*(?P<period>Q\d)?\s?(?P<year>(?:19|20)\d{2})?$
    

    请参阅regex demo

    注意

    • [^Q\d]* 是错误的,因为它匹配除Q 和数字之外的任何零个或多个字符,您需要匹配最多为Q + 数字的任何文本,即(?:(?!Q\d).)*? 缓和的贪婪令牌
    • (?P&lt;year&gt;19|20\d{2}) 是必须的,但必须是可选的,并且19|20 没有分组,所以\d{2} 只适用于20(?P&lt;year&gt;19|20\d{2}) => (?P&lt;year&gt;(?:19|20)\d{2})?

    这里还有其他小的改进。

    详情

    • ^ - 字符串开头
    • (?P&lt;symbol&gt;[^,]{1,8}) - 组“符号”:除逗号外的 1 到 8 个字符
    • (?:,[A-Z.]*)* - 零个或多个逗号重复,然后是零个或多个大写字母/点
    • \s+-\s+ - 用一个或多个空格括起来的连字符
    • (?P&lt;title&gt;(?:(?!Q\d).)*?) - 组“标题”:除换行符以外的任何字符,零个或多个,但出现次数尽可能少,不会开始 Q+digit 字符序列
    • \s* - 零个或多个空格
    • (?P&lt;period&gt;Q\d)? - 组“句号”:Q 和一个数字
    • \s? - 可选空格
    • (?P&lt;year&gt;(?:19|20)\d{2})? - 可选组“年”:1920,然后是两位数
    • $ - 字符串结束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      相关资源
      最近更新 更多