用Python解析格式

3
有没有办法在Python中通过“%”运算符逆转格式化操作?
formated = "%d ooo%s" % (12, "ps")
#formated is now '12 ooops'
(arg1, arg2) = theFunctionImSeeking("12 ooops", "%d ooo%s")
#arg1 is 12 and arg2 is "ps"

编辑 正则表达式可能是解决这个问题的一种方法,但是它们更难编写,我怀疑它们会更慢,因为它们可以处理更复杂的结构。我真的希望有一个与sscanf等效的解决方案。


5
好的,使用正则表达式。 - Marcin
1
可能是 Python 中的 sscanf 的重复问题。 - Michael Mrozek
@MichaelMrozek 谢谢,我确实忘记了那个 C 函数的名称。 - AsTeR
你不想使用正则表达式的原因是什么?如果我们能看到你想做什么,它会很有帮助。 - Nathan Jones
1
@JimDeLaHunt 不是的,我没有这样做。我需要有一个等效的sscanf函数,对吧? - AsTeR
显示剩余2条评论
1个回答

6

使用正则表达式(re 模块):

>>> import re
>>> match = re.search('(\d+) ooo(\w+)', '12 ooops')
>>> match.group(1), match.group(2)
('12', 'ps')

正则表达式是最接近您所需的操作的方法。没有办法使用相同的格式字符串('%d ooo%s')来完成它。

编辑:如@Daenyth建议,您可以实现自己的函数以具有此行为:

import re

def python_scanf(my_str, pattern):
    D = ('%d',      '(\d+?)')
    F = ('%f', '(\d+\.\d+?)')
    S = ('%s',       '(.+?)')
    re_pattern = pattern.replace(*D).replace(*F).replace(*S)
    match = re.match(re_pattern, my_str)
    if match:
        return match.groups()
    raise ValueError("String doesn't match pattern")

使用方法:

>>> python_scanf("12 ooops", "%d ooo%s")
('12', 'p')
>>> python_scanf("12 ooops", "%d uuu%s")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 10, in python_scanf
ValueError: String doesn't match pattern

当然,python_scanf不能处理更复杂的模式,如%.4f%r

@AsTeR,没有可能使用相同的格式字符串来完成它。 - juliomalegria
1
谢谢,朱利奥。你能把它加到你的答案里吗?这样我就可以接受了。 - AsTeR
3
从技术上讲,你可以编写一个函数,它以格式字符串作为输入并输出一个编译后的正则表达式,以匹配该格式字符串的输出。 - Daenyth
@AsTeR,我在我的答案中添加了另一个选项。 - juliomalegria
感谢您提供详细的答案。 - AsTeR

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