Python解析问题

2024-10-08 18:30:01 发布

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

我需要对一个字符串做一个反向的.format(),比如

a = "01AA12345AB12345AABBCCDDEE".reverseformat({id:2d}{type:2s}{a:3d}{b:4s}{c:5d}{d:2s})
print a

>>>> {'id':1, 'type':'aa', 'a':'123', 'b':'45AB', 'c':'12345', 'd':'AA'} 

我发现thislib几乎满足了我的需要,问题是它给了我这个结果

msg = parse.parse("{id:2d}{type:3S}{n:5S}", "01D1dddffffffff")

print msg.named

>>>>{'type': 'D1dddfffffff', 'id': 1, 'n': 'f'}

而不是

{'id':1, 'type':'D1d', 'n':'ddfffff'}

是否存在另一个可以将字符串“解包”到dict的lib/method/wathever?你知道吗

编辑:为了澄清,我已经尝试了字符串的w和D格式规范


Tags: 字符串idformatparsetypemsgnamedaa
2条回答

如果你的格式总是一样的,你有什么理由不能像普通的字符串一样分割它吗?你知道吗

s = "01D1dddffffffff"
id = s[:2]
type = s[2:5]
n = s[5:]

它将id、类型和n表示为:

01
D1d
ddffffffff

如果你需要的话,把它转换成字典是很简单的。如果您的解析不需要是动态的(在当前状态下似乎不是来自您的问题),那么将切片封装到一个函数中就足够容易了,该函数将提取所有的值。你知道吗

这还有一个优点,即从切片中可以清楚地看到要提取的字符串中有多少个字符和位置,但在解析格式化程序中,这些位置都是相对的(即,找到n提取的字符意味着计算idtype消耗的字符数)。你知道吗

你可以用正则表达式来做你想做的事情。你知道吗

import re

a = "01AA12345AB12345AABBCCDDEE"
expr = re.compile(r"""
    (?P<id>.{2})          # id:2d
    (?P<type>.{2})        # type:2s
    (?P<a>.{3})           # a:3d
    (?P<b>.{4})           # b:4s
    (?P<c>.{5})           # c:5d
    (?P<d>.{2})           # d:2s""", re.X)

expr.match(a).groupdict()
# {'id': '01', 'b': '45AB', 'c': '12345', 'd': 'AA', 'a': '123', 'type': 'AA'}

你甚至可以做一个这样的函数。你知道吗

def unformat(s, formatting_str):
    typingdict = {'s': str, 'f': float, 'd':int}  # are there any more?
    name_to_type = {}
    groups = re.findall(r"{([^}]*)}", formatting_str)
    expr_str = ""
    for group in groups:
        name, formatspec = group.split(":")
        length, type_ = formatspec[:-1], typingdict.get(formatspec[-1], str)
        expr_str += "(?P<{name}>.{{{length}}})".format(name=name, length=length)
        name_to_type[name] = type_
    g = re.match(expr_str, s).groupdict()
    for k,v in g.items():
        g[k] = name_to_type[k](v)

    return g

然后打电话。。。你知道吗

>>> a
'01AA12345AB12345AABBCCDDEE'
>>> result = unformat(a, "{id:2d}{type:2s}{a:3d}{b:4s}{c:5d}{d:2s}")
>>> result
{'id': 1, 'b': '45AB', 'c': 12345, 'd': 'AA', 'a': 123, 'type': 'AA'}

不过,我希望你能看到这是多么令人难以置信的丑陋。不要这样做,只是使用字符串切片。你知道吗

相关问题 更多 >

    热门问题