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']]
我需要检查单词列表中是否存在一个关键字。 如果列表很小,我可以明确列出所有关键字
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']]