【问题标题】:Regular Expression Matching Stock Ticker正则表达式匹配股票代码
【发布时间】:2017-12-29 15:48:41
【问题描述】:
我在匹配文本字符串中的股票代码时遇到了问题。我想要一个正则表达式来匹配一个空格、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)`
正则表达式错过了很多匹配项。
【问题讨论】:
标签:
python
regex
python-3.x
【解决方案1】:
如果您注意到,有一种模式会丢失项目。在非标点符号的长部分中最为明显:它错过了所有其他项目。
这是因为re.findall() 找到非重叠 匹配项,并且您的模式匹配每个匹配项之前和之后的空格。也就是说,当一个item匹配后,下一个item的初始空间已经被吞噬,不能再使用了。
使用单词边界 (\b) 而不是匹配前导/尾随空格,并使您的字符类可选:
>>> re.findall(r'\b[A-Z]{3}\b[.!?]?',example)
['FAB.', 'APL', 'APL?', 'GJA', 'ADJ', 'AKE', 'EBY', 'ZKE', 'SPR', 'TYL']
【解决方案2】:
我会使用\s[A-Z]{3}[\s\.\?](您在问题中包含“!”,但在您的正则表达式中不包含)