问题介绍
因此,我绞尽脑汁,试图让消极的前瞻性/滞后性发挥作用。对于最后一个示例输入,我的当前解决方案不返回匹配项(请参见预期输出表)。当字符串的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]
period
和year
是可选的。如果它们确实发生,则它们将位于字符串的末尾symbol
和title
总是被-
隔开,并且总是出现
预期产出
我尝试过的
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})$"
你可以用
见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})?
-可选的组“年”:19
或20
然后是两位数字$
-字符串的结尾李>相关问题 更多 >
编程相关推荐