在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
.
中的多个条目之一
两个并发症是:
names_list
中的条目可以包含空格。
- 匹配需要区分大小写。
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
表达式中使用了长长的名称列表。
使用 pyparsing
我需要为
a + names + c
和
a = pp.OneOrMore(pp.Word(pp.alphas))
c = pp.OneOrMore(pp.Word(pp.nums))
和 names
匹配字符串列表 names_list
.
两个并发症是:
names_list
中的条目可以包含空格。- 匹配需要区分大小写。
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
表达式中使用了长长的名称列表。