如何有效地解析包含大多数unicode字符的单词?

2024-06-26 02:25:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是python3.7和pyparsing==2.4.2

我基本上想以一种有效的方式分析以下内容:

import pyparsing as pp


content = pp.OneOrMore(
    pp.Word(pp.pyparsing_unicode.printables, excludeChars="#<>;")
)

以上速度大约是

content = pp.OneOrMore(
    pp.Word(pp.printables, excludeChars="#<>;")
)

再次使用pp.CharsNotIn相当快,但其行为方式与pp.Word有些不同。如果我在不匹配的字符中包含空格(这样我就得到了单独的标记),它就不能与pp.OneOrMore很好地结合。你知道吗

content = pp.OneOrMore(
    pp.CharsNotIn(" \t\r\n#<>;")
)

例如,在解析时导致ParseException

parser.content.parseString("foo bar", parseAll=True)
pyparsing.ParseException: Expected end of text, found 'b'  (at char 4), (line:1, col:5)

对于这种情况有什么好的策略吗?你知道吗


Tags: importas方式unicodecontentpyparsing字符速度
1条回答
网友
1楼 · 发布于 2024-06-26 02:25:26

我想确保性能测试将创建表达式的时间和使用表达式进行解析的时间分开。(我还试用了另外两种Regex格式,如下所述):

Create Word expression 6.56244158744812
Create Regex expression 0.0
Create Regex2 expression 3.991360902786255
Create Regex3 expression 0.4946744441986084

Parsing using Word expression
3.837733268737793
['foo', 'bar', '中文']
Parsing using Regex expression "[^ <>#;]+" 
0.07877945899963379
['foo', 'bar', '中文']
Parsing using Regex2 expression "[pp.pyparsing_unicode.printables]+"
3.8447225093841553
['foo', 'bar', '中文']
Parsing using Regex3 expression "[pp.pyparsing_unicode.printables converted to ranges]+"
0.07676076889038086
['foo', 'bar', '中文']

您可以看到两者都正确地解析了测试字符串,但是Regex大约快了40倍。我还使用从 "[" + pp.pyparsing_unicode.printables + "]+"这个结果和单词表达式差不多。你知道吗

最后,我使用通过将pp.pyparsing_unicode.printables转换为实际re范围而创建的正则表达式进行了测试,而不是仅使用一个 大百万字符重范围(比如把alphanums的正则表达式从 “[abcdefghijklmnopqrstuvxyzabefghijklmnopqrstuvxyzo123456789]+” 至“[A-Za-z0-9]+”)。你知道吗

这最终与否定范围匹配相当,使我相信将字符列表转换为重范围 对于一般的单词解析来说是一个潜在的加速(在解析器创建时有一个小的惩罚)。你知道吗

相关问题 更多 >