我在一串文字中匹配股票代码时遇到了麻烦。我想要一个正则表达式来匹配空格,3个大写字母,最后是空格,句号或问号。
以下是我创建的示例模式。
> `example = 'These are the tickers that I am trying to find: FAB. APL APL? GJA ADJ AKE EBY ZKE SPR TYL'
re.findall('[ ][A-Z]{3}[ .!?]',example)`
正则表达式错过了很多比赛。
答案 0 :(得分:6)
如果你注意到,那里有一个错过项目的模式。它在很长的非标点符号中最为明显:它错过了其他所有项目。
这是因为re.findall()
找到非重叠匹配,并且您的模式匹配每个匹配前后的空格。这意味着在匹配一个项目后,下一个项目的初始空间已被吞噬,无法再次使用。
使用单词边界(\b
)而不是匹配前导/尾随空格,并使您的角色类可选:
>>> re.findall(r'\b[A-Z]{3}\b[.!?]?',example)
['FAB.', 'APL', 'APL?', 'GJA', 'ADJ', 'AKE', 'EBY', 'ZKE', 'SPR', 'TYL']
答案 1 :(得分:-1)
我会使用\s[A-Z]{3}[\s\.\?]
(你在问题中包括“!”而不是你的正则表达式)