使用Python中的正则表达式的股票代码频率

时间:2014-09-18 05:12:17

标签: python regex symbols stock

我需要一个可以从单词列表中获取股票代码的正则表达式。更具体地说,我只需要股票代码(股票代码周围没有价格或随机符号,如@或....或#),它识别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

4 个答案:

答案 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)

(\$[\w,]+\b)

您可以尝试此操作。这将返回所有$words的列表。然后您可以从那里开始计算。

参见演示。

http://regex101.com/r/jT3pG3/42

相关问题