我想从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字符,它可以正常工作。就像这样:
sample.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机器。
发布于 2018-10-16 06:53:36
我自己找到了解决办法。我不知道这是否是实现这一目标的方便方法。但在我看来没问题。
从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发布于 2018-10-15 20:50:41
在代码中的两处将alphanums替换为alphanums+alphas8bit,如下所示。
key = Word(alphanums+alphas8bit)('key')问题是alphanums只匹配未加重音的拉丁字母(加上数字数字)。alphas8bit匹配拉丁文-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 5https://stackoverflow.com/questions/52818981
复制相似问题