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

时间:2017-01-19 07:47:03

标签: python performance parsing case-insensitive 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条目)
  4. 我试过

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

    这对于带空格的条目不起作用我担心这不是一种非常有效的写入方式。

    是否有任何想法让这个用于条目中的空格并且可能使其表现更快?

1 个答案:

答案 0 :(得分:1)

部分答案:

可以使用正确的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表达式中使用了很长的名称列表。