我需要一个可以从单词列表中获取股票代码的正则表达式。更具体地说,我只需要股票代码(股票代码周围没有价格或随机符号,如@或....或#),它识别AMZN与amzn相同。一个正则表达式可以实现这个吗?
代码:
def read_file(fileName):
return open(fileName).read().split()
def get_frequency(words):
freq = {}
for w in words:
if "$" in w:
freq[w] = freq.get(w, 0) + 1
return freq
def print_frequency(words):
for word, frequency in words.items():
print word, ":", frequency
def main():
stringText = read_file(file)
print_frequency(get_frequency(stringText))
main()
示例输入:
@jimcramer @Taarriqq @AnthonyTanpoco在$ GPRO上更具体一点。 THX
股票大赛!!选择$ GLD并赢取免费平板电脑!现在输入!点击此处了解详情:
http://t.co/gW8Rohq8TT $ BBRD $ TLT $ MRK $ GPRO~
股票大赛!!选择$ GDXJ并赢取免费平板电脑!现在输入!点击此处了解详情:
http://t.co/ekGDWveFh2 $ GRCU $ LOCO $ XIV $ TSO~
Closing Bell已经出局了! http://t.co/rQE910SvNL $ EURUSD $ GBPUSD $ USDJPY $ AUDUSD $ SPY $ TWTR $ GPRO $ YHOO $ LNKD $ FB $ AAPL $ BRD $ CAT $ WLT $ LNKD
@8DVolition很棒我也会这样做。 $ GPRO完全延迟。短裤被监狱强奸。 http://t.co/zOnc7WgjX0@ 8DVolition我把LOCO和$ GPRO放了一小段时间,但当你知道boyzzz已经保释时感染点还没有发生。
@ 8DVolition和他妈的$ LOCO
@ 8DVolition我的意思是看看$ GPRO那个http://t.co/ULQtdLAyvZ验证$ RADA $ 181.97美元损失我的损失太快了。
我退出后的第二天股票跑了。今天的赢家反对看跌 - $ AMZN $ LULU $ KORS $ WSM $ POT $ AGN $ LOCO $ SCTY $ FSLR $ EBAY $ UVXY $ RUBI&所有财务
千万富翁交易员SUPERTRADES和他的EASY复制策略可以赚钱! http://t.co/Ho9ydXHTWl $ ARWR $ TWTR $ LOCO
刚刚检查了$ GPRO .. $ 25到$ 70哇!
http://t.co/CLn9obslnu已经认证$ 9,508 $ GPRO周的利润为$ 2,503.58
http://t.co/KaXsGKaX5v已验证$ 995的$ GPRO周盈利$ 1,495.17
http://t.co/hQoJG9hjpq验证$ 9。8 $ GPRO周损失$ 398.90
http://t.co/5lbEFFZOTl已通过9/8美元GPRO周验证$ 585.66的利润
@ JPelletier22该死的兄弟,需要你这样做。我们应该给你买一些$ LOCO! http://t.co/rcHjORcFpf已验证$ RADA周9/8美元损失4,293.01美元
@ 8DVolition不得不轻描淡写地说......一个la $ GPRO寡妇制造者
$ GPRO将在未来10年内继续增长。这将是从现在起6个月内的100美元股票。
股票大赛!!选择$ EBAY并获得免费平板电脑!!现在输入!点击此处了解详情:http://t.co/Zhx90b0JuP $ PG $ CENX $ BRK / B $ GPRO~
观看这个免费视频我们如何赚取$ 100,000 + http://t.co/D4ZEMzcp6W $ NETE $ OTIV $ ISNS $ RADA学习$ TWTR $ STUDY
千万富翁交易员SUPERTRADES和他的EASY复制策略可以赚钱! http://t.co/Ho9ydXHTWl $ ARWR $ TWTR $ LOCO
股票大赛!!选择$ DIS并赢取免费平板电脑!!现在输入!点击此处了解详情:http://t.co/CjtKbbArjo $ VGZ $ PLUG $ AA $ LOCO~
$ BABA这么多的买入将进入这个趋势交易10点并且每天头皮为3点=每周15点$ GPRO风格
另一个20,000美元的利润周让我感谢$ ISNS $ NETE $ OTIV $ RADA $ EKSO现在是一个周末海滩/好玩的时间! http://t.co/bP2IhYIu79
每月只需147美元即可获得@super_trades'夜间观察列表& LIVE聊天室访问:$ AAPL $ TWTR $ FB $ BABA $ YHOO $ LOCO $ GPRO $ TSLA $ GOOG $ LNKD
示例输出:
$BIIB : 2
$THRX : 1
$CNE.TO : 1
$nflx : 4
$THRM : 2
$GPRO,...Fully : 1
$EFOI : 17
$4. : 2
$ILMN : 1
$0.10 : 1
$XLY : 7
$EXC : 2
$XLE : 3
$XLF : 11
$48 : 1
$XLB : 3
$1,000,000 : 1
$42 : 4
$40 : 3
$47 : 1
$XLI : 1
$45 : 4
$XLK : 2
$SCOK; : 1
$EXEL... : 1
$VALE : 7
$IVDN : 2
$Gpro : 2
$AEO : 1
$AEM : 2
$SCOK. : 3
$SCOK, : 14
$blue, : 1
$GIG : 1
$UNH : 1
$UNG : 2
答案 0 :(得分:1)
从我看到的所有股票代码都以$
开头,并显示为独立字词。这使得正则表达式变得不必要。通过避免使用正则表达式,此解决方案应该更快:
from collections import Counter
with open('input') as f:
words = f.read().upper().split()
symbols = [word for word in words if len(word) > 1 and word[0]=="$" and word[1:].isalpha()]
freqs = Counter(symbols)
for key in sorted(freqs):
print '%-8s : %3i' % (key, freqs[key])
这里使用出现在python2.7 + / 3.1 +中的collections模块获得频率数据。如果您使用的是早期版本,请尝试:
with open('input') as f:
words = f.read().upper().split()
symbols = [word for word in words if len(word) > 1 and word[0]=="$" and word[1:].isalpha()]
freqs = Counter(symbols)
freqs = {}
for sym in symbols:
freqs[sym] = freqs.get(sym, 0) + 1
for key in sorted(freqs):
print '%-8s : %3i' % (key, freqs[key])
输出的前几行看起来像:
$AA : 1
$AAPL : 2
$AGN : 1
$AMZN : 1
$ARWR : 2
$AUDUSD : 1
$BABA : 2
$BBRD : 1
$BRD : 1
注意:
with open('input') as f:
此构造确保文件在不再需要时立即关闭。
words = f.read().upper().split()
这将读取文件,将所有字母字符转换为大写,然后将文本拆分为单词。
symbols = [word for word in words if len(word) > 1 and word[0]=="$" and word[1:].isalpha()]
通过要求(1),包括美元符号,它们至少包含两个字符,(2)以美元符号开头,以及(3)后面的单词的其余部分,从单词中选择符号美元符号是字母的。此测试消除了对正则表达式的需求。
答案 1 :(得分:1)
使用Counter
来帮助跟踪库存计数,re.I
会使您的正则表达式不区分大小写:
>>> import re
>>> from collections import Counter
>>> exp = r'\$([A-Z]{4})'
>>> stocks = Counter()
>>> with open('stock.txt') as f:
... for line in f:
... stocks.update(re.findall(exp, line, re.I))
...
>>> stocks.most_common()
[('GPRO', 16), ('LOCO', 8), ('TWTR', 5), ('RADA', 4), ('LNKD', 3), ('AAPL', 2), ('ISNS', 2), ('OTIV', 2), ('BABA', 2), ('NETE', 2), ('YHOO', 2), ('EBAY', 2), ('ARWR', 2), ('GOOG', 1), ('AUDU', 1), ('TSLA', 1), ('AMZN', 1), ('KORS', 1), ('PLUG', 1), ('CENX', 1), ('GBPU', 1), ('STUD', 1), ('FSLR', 1), ('EURU', 1), ('RUBI', 1), ('LULU', 1), ('USDJ', 1), ('GDXJ', 1), ('GRCU', 1), ('EKSO', 1), ('BBRD', 1), ('SCTY', 1), ('UVXY', 1)]
John在评论中有一些好处,并且根据他的建议,这里是更新(也选择了$FB
):
>>> exp = r'\$([A-Z]{1,4})'
>>> stocks = Counter()
>>> with open('stock.txt') as f:
... for line in f:
... stocks.update(list(map(str.upper, re.findall(exp, line, re.I))))
...
>>> stocks.most_common()
[('GPRO', 16), ('LOCO', 8), ('TWTR', 5), ('RADA', 4), ('LNKD', 3), ('AAPL', 2), ('FB', 2), ('ISNS', 2), ('NETE', 2), ('YHOO', 2), ('OTIV', 2), ('EBAY', 2), ('BABA', 2), ('ARWR', 2), ('TSO', 1), ('AUDU', 1), ('VGZ', 1), ('TSLA', 1), ('AGN', 1), ('GLD', 1), ('CAT', 1), ('DIS', 1), ('WSM', 1), ('AMZN', 1), ('PLUG', 1), ('SPY', 1), ('CENX', 1), ('POT', 1), ('GBPU', 1), ('GOOG', 1), ('PG', 1), ('STUD', 1), ('RUBI', 1), ('BRK', 1), ('KORS', 1), ('AA', 1), ('EURU', 1), ('TLT', 1), ('WLT', 1), ('LULU', 1), ('USDJ', 1), ('GDXJ', 1), ('GRCU', 1), ('XIV', 1), ('MRK', 1), ('BBRD', 1), ('FSLR', 1), ('EKSO', 1), ('SCTY', 1), ('UVXY', 1), ('BRD', 1)]
答案 2 :(得分:0)
一个抓住你所要求的模式的RegExp:
re.match("([A-Z]{4})|([a-z]{4})", string)
它基本上有4个大写字母或4个小写字母。但是,如果你的字符串有长文本,它也会得到文本的部分内容。
如果是这种情况,您应该一起选择您尝试抓取的所有股票期权的名称,并将其作为结构的一部分进行检查。
答案 3 :(得分:0)