我正在寻找一个与Python中的sscanf()
等价物。我想解析/proc/net/*
文件,在C中我可以这样做:
int matches = sscanf(
buffer,
"%*d: %64[0-9A-Fa-f]:%X %64[0-9A-Fa-f]:%X %*X %*X:%*X %*X:%*X %*X %*d %*d %ld %*512s\n",
local_addr, &local_port, rem_addr, &rem_port, &inode);
一开始我想使用str.split
,但是它不拆分给定的字符,而是将sep
字符串作为一个整体:
>>> lines = open("/proc/net/dev").readlines()
>>> for l in lines[2:]:
>>> cols = l.split(string.whitespace + ":")
>>> print len(cols)
1
它应该返回17,如上所述。
在标准库中,有没有等同于sscanf
(而不是RE)的Python,或者字符串拆分函数,它可以拆分我不知道的字符范围中的任何字符?
发布于 2010-02-01 14:51:50
Python没有与sscanf
等效的内置工具,大多数情况下,通过直接处理字符串、使用正则表达式或使用解析工具来解析输入实际上更有意义。
可能对翻译C语言最有用的可能是,人们已经实现了sscanf
,例如在这个模块中:http://hkn.eecs.berkeley.edu/~dyoo/python/scanf/
在这种特殊情况下,如果您只想根据多个拆分字符拆分数据,re.split
确实是正确的工具。
发布于 2012-10-12 12:18:50
还有parse
模块。
parse()
被设计成与format()
相反(Python2.6及更高版本中较新的字符串格式化函数)。
>>> from parse import parse
>>> parse('{} fish', '1')
>>> parse('{} fish', '1 fish')
<Result ('1',) {}>
>>> parse('{} fish', '2 fish')
<Result ('2',) {}>
>>> parse('{} fish', 'red fish')
<Result ('red',) {}>
>>> parse('{} fish', 'blue fish')
<Result ('blue',) {}>
发布于 2012-06-18 22:55:37
当我处于C状态时,我通常使用zip和list来理解类似scanf的行为。如下所示:
input = '1 3.0 false hello'
(a, b, c, d) = [t(s) for t,s in zip((int,float,strtobool,str),input.split())]
print (a, b, c, d)
注意,对于更复杂的格式字符串,您确实需要使用正则表达式:
import re
input = '1:3.0 false,hello'
(a, b, c, d) = [t(s) for t,s in zip((int,float,strtobool,str),re.search('^(\d+):([\d.]+) (\w+),(\w+)$',input).groups())]
print (a, b, c, d)
另请注意,您需要为所有要转换的类型提供转换函数。例如,上面我使用了类似如下的内容:
strtobool = lambda s: {'true': True, 'false': False}[s]
https://stackoverflow.com/questions/2175080
复制相似问题