在pyparsing中匹配大量包含空格的字符串

Matching against a large number of strings containing spaces in pyparsing

使用 pyparsing 我需要为

这样的表达式编写一个匹配器
a + names + c 

a = pp.OneOrMore(pp.Word(pp.alphas))
c = pp.OneOrMore(pp.Word(pp.nums))

names 匹配字符串列表 names_list.

中的多个条目之一

两个并发症是:

  1. names_list中的条目可以包含空格
  2. 匹配需要区分大小写
  3. names_list 相当大(~20000 个条目)

我试过了

names_kw_list = [pp.Keyword(name, caseless=True) for name in names_list ]
names = pp.Or(names_kw_list)

这不适用于带有空格的条目,而且我担心这不是一种非常高效的编写方式。

有什么想法可以使它对条目中的空格起作用并可能使其执行得更快吗?

部分答案:

空格问题可以用正确的stopOn函数解决:

def last_occurrence_of(expr):
    return expr + ~pp.FollowedBy(pp.SkipTo(expr))

names_kw_list = [pp.Keyword(word, caseless=True)
                                       for word in names_list ]
names = pp.Or(names_kw_list)("names")
a = pp.OneOrMore(pp.Word(pp.alphas), stopOn=last_occurrence_of(names))("A")
c = pp.OneOrMore(pp.Word(pp.nums))("C")

expr = a + names + c 

这指示 a 不要吃掉 names 的字符串。

但是性能变差了,因为现在在 stopOn 表达式中使用了长长的名称列表。