Pyparsing 从文件中读取 Unicode 字符

4
我希望您能够读取sample.cfg文件中的一些值并对它们进行解析。代码如下:
from pyparsing import *

key = Word(alphanums)('key')
equals = Suppress('=')
value = Word(alphanums)('value')

kvexpression = key + equals + value

with open('sample.cfg') as config_in:
  config_data = config_in.read()

for match in kvexpression.scanString(config_data):
  result = match[0]
  print("{0} is {1}".format(result.key, result.value))

如果我使用ASCII字符,它可以正常工作。就像这样:

示例.cfg

city=Atlanta
state=Georgia
population=5522942

但如果我在输入文件中使用一些unicode字符,它不能按预期工作。

sample.cfg(带有Unicode字母)

şehir=İzmir
ülke=Türkiye
nüfus=4279677

如果您运行此程序,其输出如下所示:
lke is T
fus is 4279677

您会发现它会忽略Unicode字符。

更新:

我按照建议修改了代码。现在变成了这样:

from pyparsing import*

key = Word(alphanums + alphas8bit)('key')
equals = Suppress('=')
value = Word(alphanums + alphas8bit)('value')

kvexpression = key + equals + value

with open('şehir.cfg') as config_in:
  config_data = config_in.read()

for match in kvexpression.scanString(config_data):
  result = match[0]
  print("{0} is {1}".format(result.key, result.value))

需要进行的是数据文件的小改动:

sample.cfg

şehir=İzmir
ülke=Türkiye
nüfus=4279677
alfabe=AaBbCcÇçDdEeFfGgĞğHhIiİiJjKkLlMmNnOoÖöPpRrSsŞşTtUuÜüVvYyZz

当我运行程序时,它的输出如下。
ülke is Türkiye
nüfus is 4279677
alfabe is AaBbCcÇçDdEeFfGg

正如您所看到的,以重音s 'ş'开头的第一行未显示。我之前就注意到了这种情况。

几乎到了,但还不够。

我使用的是Linux系统。

2个回答

2

在您的代码中的两个位置将alphanums替换为alphanums+alphas8bit,就像这行代码一样。

key = Word(alphanums+alphas8bit)('key')

问题在于alphanums只匹配非重音的拉丁字母(加上数字),而alphas8bit则匹配Latin-1中的额外8位字符。
当我对这个输入运行修改后的代码时,
sehir=Izmir
ülke=Türkiye
nüfus=4279677
AaBbCcÇçDdEeFfGgGgHhIiIiJjKkLlMmNnOoÖöPpRrSsSsTtUuÜüVvYyZz = 5

当土耳其字母表完整地出现在最后一行时,结果是:

sehir is Izmir
ülke is Türkiye
nüfus is 4279677
AaBbCcÇçDdEeFfGgGgHhIiIiJjKkLlMmNnOoÖöPpRrSsSsTtUuÜüVvYyZz is 5

谢谢。差不多了。但是它没有显示第一行。我已经更新了帖子以展示更改。 - user762630
抱歉,@Erdem!我不知道我是怎么错过我的结果中的那个缺陷的。很好,你还是得到了一个结果。 - Bill Bell
1
尝试在pyparsing 2.3.0版本中使用新的pyparsing.pyparsing_unicode.Latin1.alphanums - PaulMcG

2

我已经自己找到了解决方案。我不知道这是否是实现这个的便捷方式。但对我来说看起来很好。

从pyparsing导入*

alphanums_tr = u'abcçdefgğhiijklmnoöprsştuüvyzABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZ0123456789'

key = Word(alphanums_tr)('key')
equals = Suppress('=')
value = Word(alphanums_tr)('value')

kvexpression = key + equals + value

with open('şehir.cfg') as config_in:
  config_data = config_in.read()

for match in kvexpression.scanString(config_data):
    result = match[0]
    print("{0} is {1}".format(result.key, result.value))

程序的输出如下:
şehir is İzmir
ülke is Türkiye
nüfus is 4279677
alfabe is AaBbCcÇçDdEeFfGgĞğHhIiİiJjKkLlMmNnOoÖöPpRrSsŞşTtUuÜüVvYyZz

1
尝试在pyparsing 2.3.0版本中使用新的pyparsing.pyparsing_unicode.Latin1.alphanums - PaulMcG
如果需要为LatinA和LatinB扩展添加额外的范围,这很容易实现。我发现我还省略了这些范围的文档字符串,这将是不错的。 - PaulMcG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接