本文共 1623 字,大约阅读时间需要 5 分钟。
博主欢迎转载,但请一定要给出原文链接,标注出处!!!谢谢~
特别不喜欢那些随便转载别人的原创文章又不给出链接的
所以不准偷偷复制博主的博客噢~~
最近写python的时候,正好碰到需要对输入数据进行一些处理,想看看python有没有类似于C的scanf格式化输入,这样就可以按照想要的格式读入数据。查找了下,发下并没有,但找到了一个替代品,举个例子。
import re #python的正则表达式模块input = '1:3.125 false,hello'(a, b, c, d) = [t(s) for t,s in zip((int,float,bool,str),re.search('^(\d+):([\d.]+) (\w+),(\w+)$',input).groups())]print inputprint re.search('^(\d+):([\d.]+) (\w+),(\w+)$',input).groups()print zip((int,float,bool,str),re.search('^(\d+):([\d.]+) (\w+),(\w+)$',input).groups())print (a, b, c, d)#代码出处#作者:知乎用户#链接:https://www.zhihu.com/question/49840816/answer/145443497#来源:知乎#著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
输出结果为:
1:3.125 false,hello('1', '3.125', 'false', 'hello')[(, '1'), ( , '3.125'), ( , 'false'), ( , 'hello')](1, 3.125, True, 'hello')
可以看到最终a,b,c,d的结果也确实是从输入中获取的用户希望的结果,下面就主要来详细介绍一下各部分。
re.search('^(\d+):([\d.]+) (\w+),(\w+)$',input).groups()
re.search是在给定字符串内查找匹配的字符串,groups()函数则是以tuple的形式返回所有括号匹配到的内容,因此可以看到对应的输出结果为(‘1’, ‘3.0’, ‘false’, ‘hello’)。
这里给还不懂得正则表达式的童鞋进行一下知识的普及,^(\d+):([\d.]+) (\w+),(\w+)$中有四个(),括号是为了提取匹配的字符串,表达式中有几个()就会匹配几个字符串。^是匹配字符串的开始,$是匹配字符串的结束。\d匹配数字,\w匹配字母或数字或下划线,[]是定义匹配的字符范围,+则是匹配一次或多次。
因此,(\d+)是匹配1个或多个数字,([\d.]+) 是匹配包含数字和小数点,(\w+)则是匹配包含字母、数字、下划线的字符串。
zip((int,float,bool,str),re.search('^(\d+):([\d.]+) (\w+),(\w+)$',input).groups())
zip函数是接收多个序列作为参数,然后返回一个tuple列表,列表里的第i个tuple,由每个序列中第i个元素构成,参见下面这个例子。
x = [1, 2, 3]y = [4, 5, 6]z = [7, 8, 9]xyz = zip(x, y, z)print xyz#[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
因此,第三行的输出结果即为类型和匹配字符串所构成的tuple序列,对应t,s。t(s)显然就是将对应的s转化为相应的t类型,即最终结果的a,b,c,d。