Python-格式化输入、字符串分割

博主欢迎转载,但请一定要给出原文链接,标注出处!!!谢谢~

http://blog.csdn.net/sunny_xsc1994/article/details/78351620

特别不喜欢那些随便转载别人的原创文章又不给出链接的

所以不准偷偷复制博主的博客噢~~

Python-格式化输入、字符串分割

最近写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 input
print 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')
[(<type 'int'>, '1'), (<type 'float'>, '3.125'), (<type 'bool'>, 'false'), (<type 'str'>, '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。

猜你喜欢

转载自blog.csdn.net/sunny_xsc1994/article/details/78351620