正则表达式负表达式匹配

2024-10-16 17:26:28 发布

您现在位置:Python中文网/ 问答频道 /正文

问题介绍

因此,我绞尽脑汁,试图让消极的前瞻性/滞后性发挥作用。对于最后一个示例输入,我的当前解决方案不返回匹配项(请参见预期输出表)。当字符串的title部分包含一个不在字符串末尾的年份时,我正在努力解决如何匹配它。明确地说,我只对匹配字符串末尾的year感兴趣。在最后一个示例中,当前正则表达式失败,因为它与title中的NOT("Q" OR "\d*")匹配。但是,我只希望它与NOT("Q" AND "\d{1}")匹配。非常感谢任何提示/建议。注意使用Python3.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总是被-隔开,并且总是出现

预期产出

^{tb1}$

我尝试过的

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})$"

Tags: 字符串示例titlenotcallyearperiodpl
1条回答
网友
1楼 · 发布于 2024-10-16 17:26:28

你可以用

^(?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<year>19|20\d{2})是必须的,但它必须是可选的,并且19|20没有分组,因此\d{2}仅应用于20(?P<year>19|20\d{2})=>(?P<year>(?:19|20)\d{2})?

这里还有其他一些小的增强功能

详细信息

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

相关问题 更多 >