pyparsing - 大列表中的关键字之一

pyparsing - one of keywords from big list

我需要检查单词列表中是否存在一个关键字。 如果列表很小,我可以明确列出所有关键字

ticker = CaselessKeyword('SPY') | CaselessKeyword('QQQ')
ticker.run_tests(['SPY', 'QQQ'])

但是如果列表非常大(10k-100k 关键字)并且我们想确保在这个地方只有这些词之一,那么正确的解决方案是什么?

与其在一个大 MatchFirst 中创建数千个 CaselessKeywords,不如编写一个只匹配一个字符的表达式,然后针对一组字符串进行验证已知的股票代码。

请参阅下面的代码,它使用解析操作将找到的单词大写,然后使用条件过滤有效的股票代码。

我使用 space-delimited 字符串定义了 ticker_symbols,以便轻松添加新符号。只需向此列表添加新符号,以空格分隔,并根据需要添加换行符。

但是无论如何,当符号列表达到数千个时(hundred-thousands!),这个过程将非常缓慢。

import pyparsing as pp

# define all valid ticker symbols - save in a set for fast "in" testing
ticker_symbols = set("""\
AAPL IBM GE F TTT QQQ SPY GOOG INTL TI HP AMD
""".split())

# parse action condition to see if a word matches any ticker symbol
def is_ticker(t):
    return t[0] in ticker_symbols

# expression to match any word of characters, detecting word breaks
ticker = pp.Regex(r"\b[A-Za-z]+\b")

# add upper-casing parse action and ticker-validating condition
ticker.addParseAction(pp.common.upcaseTokens)
ticker.addCondition(is_ticker)

# try it out
print(ticker.searchString("AAA SPYY QQQ INTL1 A AAPL ge zaapl"))

版画

[['QQQ'], ['AAPL'], ['GE']]