PYTandFA 2017-07-11
字符串的处理是编译语言中不可缺少的部分,特别是在输入输出的时候,Python字符串的处理比较多样,便捷。
Python字符串的拼接结合了Java和C语言的形式,但是形式上多了很多方式
1.多字符串连接
多字符串的连接和Java很像,主要有这些形式
>>> print "hello"+"world" helloworld >>> print "hello","world" hello world >>> print "hello" "world" helloworld >>> print "hello""world" helloworld
还有一种类似C语言的形式
>>> print "%s,%s" %("hello","world") hello,world
2.利用list进行拼接
>>> var_list = ['tom', 'david', 'john'] >>> a=',' >>> a.join(var_list) 'tom,david,john'
3.字符串乘法
>>> a='abc' >>> print a*3 abcabcabc
Python的字符串类似于一个字符数组,可以根据输入的字符区间来截取字符串,主要的形式是str[start:end]
(包括开始的位置,不包括结束的位置)。
>>> a[1:3] 'el' >>> a[:3] 'hel' >>> a[1:] 'elloworld' >>> a[:] 'helloworld'
字符位置和数组类似,从0开始,例子中很明显可以看出,如果不写开始位置,默认从头开始,不写结束位置,默认到最后,但是字符串过长,从头开始太繁琐,Python还支持从末尾开始计数确认位置,-1表示最末尾的数。
>>> str="012345" >>> str[-4:-2] '23'
但是负数只用于定位,与截取的顺序和长度无关,所以可以这么使用:
>>> str[-4:4] '23' >>> str[-4:] '2345' >>> str[:-2] '0123'
而且这种截取是可以设置截取时的步长的,甚至可以逆转字符串方向,交换一下开始和结尾的位置,然后将步长改成负数。第一个是开始位置,第二个是结束位置,第三个是跨度(负数表示倒着)。
>>> a="abcdef" >>> a[1:5:2] 'bd' >>> a[5:1:-1] 'fedc'
另外还有一种截取方式,是利用正则表达式来截取字符串的匹配部分,将获取结果放入一个list中。如下:\d表示数字(代表0-9),+表示大于1个
>>> import re >>> str="12j33jk12 ksdjfkj23jk4h1k23h" >>> mode= re.compile("\d+") >>> mode.findall(str) ['12', '33', '12', '23', '4', '1', '23']
另外还有和Java的split一样的方式,默认是空白字符,可以设置分割次数,与之相似的还有resplit。如下:split()不带参数表示已空格进行分割,[2]表示切割成2个分片
>>> b="a b c d" >>> print b.split() ['a', 'b', 'c', 'd'] >>> b="a,b,c,d" >>> print b.split(",") ['a', 'b', 'c', 'd'] >>> print b.split(",",2) ['a', 'b', 'c,d'] >>> b.rsplit(",",2) ['a,b', 'c', 'd']
还有一个或许使用比较少,splitlines可以保留分隔符,参数为True保留,参数为False不保留,默认为False,但是这个不能设置分隔符,只能按照\n来分割。
>>> b="a\nb\nc\nd" >>> b.splitlines() ['a', 'b', 'c', 'd'] >>> b.splitlines(True) ['a\n', 'b\n', 'c\n', 'd']
这个一般用的不多,主要是定位某个字符或者某个字符子串起始位置在一个字符串中第一次出现的位置,一般用find方法或者index方法。
find方法可以确定从左开始第一次出现某个字符串或者某个字符串起始位置在一个字符串中的位置,而rfind则是从右开始,没有找到为-1.
>>> a="abcdef" >>> a.find("c") 2 >>> a.find("cde") 2 >>> b="abcabcabc" >>> b.rfind("a") 6 >>> b.rfind("abc") 6 >>> b.rfind("d") -1
index和rindex的使用方法和find/rfind方法基本一致,只是在没有匹配到结果的时候会返回运行时错误。
>>> b="abcabcabc" >>> b.index("c") 2 >>> b.index("bc") 1 >>> b.rindex("bc") 7 >>> b.rindex("a") 6 >>> b.rindex("d") Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: substring not found
还有一种另类的查找,是统计所查字符串出现的次数
>>> b.count("c") 3
另外字符串截取的时候介绍的正则表达截取其实也是查找的方式,只是这种方式返回的是字符串,而不是位置。
由于python中大部分删除操作就是将要删除的内容进行替换成“ ”来完成的。
除了我们可以通过截取字符串来消除字符串首尾的相应字符串等内容,还可以通过strip方法来实现,另外还有两个很相似的方法lstrip和rstrip,分别是消除首部和尾部的相应字符串。
>>> str="abcdefabc" >>> str.strip("abc") 'def' >>> str.lstrip("abc") 'defabc' >>> str.rstrip("abc") 'abcdef'
如果不输入参数,默认删除的是'\n','\t','\r',' '。
字符串替换使用的replace和Java很类似,都是对指定字符的替换,并且可以指定替换的次数。
>>> str="abcabcabc" >>> str.replace("a","k") 'kbckbckbc' >>> str.replace("a","k",2) 'kbckbcabc'
除了使用这种方式,正则式替换也是一种方式
>>> import re >>> a="mark" >>> patten = re.compile("[abc]") >>> patten.sub("o",a) 'mork' >>> re.sub("[abc]","o",a) 'mork'
有两种使用方式,效果都是一样的。
通过expandtabs方法将字符串中的tab替换成n个字符空格,n是expandtabs的参数,不填默认为8,即不替换。
>>> a="a b c" >>> a.expandtabs() 'a b c' >>> a.expandtabs(0) 'abc' >>> a.expandtabs(1) 'a b c'
通过python自带的方法将字符串的大小写进行转换,lower是将其中的大写转换成小写,upper则是相反,把小写转换成大写,swapcase则是相互转换,capitalize是将字符小写之后将首字符大写。
>>> a="abCDefG" >>> a.lower() 'abcdefg' >>> a.upper() 'ABCDEFG' >>> a.swapcase() 'ABcdEFg' >>> a.capitalize() 'Abcdefg'
字符和数值的转换方式有两种,一种是普通的转换,一种是使用String模块进行转换
>>> str(1) '1' >>> str(1.234) '1.234' >>> int("1") 1 >>> float("1.234") 1.234 >>> chr(97) #ascii码的转换 >>> ord("a") 97
这是一般的方式,适用于不需要特殊要求的方式,当需要对字符转换成的数值进行进制的转换的时候,就需要string模块了。
>>> string.atoi("12") 12 >>> string.atoi("12",16) 表示12是16进制的,转换成10进制是18 18 >>> string.atoi("12",8) 10
后面的参数是字符串的进制,如果不写,默认是10进账,转换后的结果默认是10进制。
这个是程序跨平台很常见的问题,由于不同平台显示的编码格式不同,容易出现乱码问题,常用的方式在输入输出的时候已经写了,但是在局部特殊使用时还是需要方法解决,就会用到decode和encode,将字符串先转换成Python内部的Unicode码,运行时转换成相应平台可显示的编码。
decode是用于对Unicode进行编码,使用方式一般是str.decode(encoding='UTF-8',errors='strict')
,errors参数是设置编码不成功的处理方案,其可能得值有'strict','ignore','replace','xmlcharrefreplace' ,'backslashreplace'以及通过codecs.register_error()注册的任何值,encoding参数是编码类型。
encode是对某个类型的字符串解码成Unicode,使用方法一般是str.encode(encoding='UTF-8',errors='strict')
,参数和decode相同,而在sys有个方法可以与这两个配合使用,sys.getdefaultencoding()
用于获取当前系统使用的默认编码类型。