使用pyparsing.srange构建大字符范围速度极慢,求原因及替代方案
问题原因与解决方案
为什么这段代码速度极慢?
你用srange('[\x80-\U0010FFFF]')生成的是所有非ASCII字符的完整集合,这个范围包含了超过100万个字符(从0x80到0x10FFFF,总计约111万个字符)。pyparsing的Char类在处理这类超大字符集时,会逐个枚举并初始化每个字符的匹配规则,这个过程需要遍历百万级的元素,因此会消耗大量时间(6-8秒)。
替代方案
推荐两种高效的实现方式,无需枚举所有非ASCII字符:
方案1:利用pyparsing的取反操作
直接对ASCII字符范围取反,避免生成超大字符集:
from pyparsing import Char, srange _non_ascii = ~Char(srange('[\x00-\x7F]'))
~操作符表示“匹配不在该字符集中的字符”,底层通过区间判断实现,初始化几乎瞬间完成。
方案2:使用正则表达式
pyparsing支持直接集成正则表达式,正则引擎对字符区间的处理更高效:
from pyparsing import Regex _non_ascii = Regex(r'[^\x00-\x7F]')
正则的[^\x00-\x7F]表示匹配任何不在ASCII范围内的字符,底层通过数值区间比较实现,无需枚举字符。
内容的提问来源于stack exchange,提问作者InSync
相关产品推荐
相关产品推荐

