喵吉欧尼酱

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::
字符串
   1.使用单引号“'”引起来: 'Quote me on this'

   2.使用双引号“"”引起来: "What's your name?"

   3.使用三引号('''或"""): 可以指示一个多行的字符串。你可以在三引号中自由的使用单引号和双引号。 /'''
     如:
     """This is a multi-line string. This is the first line.
     "What's your name?," I asked.
     He said "Bond, James Bond."
     """

   4.转义符“\”
     \\  指示反斜杠本身
     \'  指示单引号
     \"  指示双引号
     注意: 行末的单独一个反斜杠表示字符串在下一行继续,而不是开始一个新的行。

   5.自然字符串
     自然字符串通过给字符串加上前缀r或R来指定,取消转义符的功能。例如: r"Newlines are indicated by \n"。
     三引号的字符串也可以同样用法,如: R'''Newlines are indicated by \n'''

   6.unicode 字符串
     Python允许你处理 unicode 文本(超过拉丁文字范围的)——只需要在字符串前加上前缀u或U。
     例如,u"This is a Unicode string.哈哈.."。(Python3.x之后不需要这样了,可以直接写中文;而这样写会报错)
     Python 3.0开始对unicode全面支持,所有的文本(str)都是Unicode的;并引入了一个叫做bytes的新类型来处理字节序列。而编码过的Unicode会以二进制的数据来表示。
     因为在2.x的世界里,大量的bug都是因为已编码的文本和未编码的文本混杂在一起而产生的。

   7.按字面意义级连字符串
     如果你把两个字符串按字面意义相邻放着,他们会被Python自动级连。
     例如,"What's" ' your name?'会被自动转为"What's your name?"。
     即是说,两个字符串放在一起,会有字符拼接的效果。加号“+”也有字符拼接的效果。

   8.字符串拼接
     可以使用“str1.__add__(str2)”或者“str1 + str2”或者直接两个字符串放一起,来拼接字符串
     但字符串与其它类型拼接时,得先把其它类型转成字符串类型,否则会出错。如“str1 + 2”就会出错,需要“str1 + str(2)”

   9.字符串的乘法运算
    “*”:可以把字符串重复拼接若干次,如: 2 * 3得到6; 'la' * 3得到'lalala'。但乘以0或者负数时,结果将会是空字符串""10.字符串序列(索引和切片)
     字符串可以使用下标来获取字符串中某个项目,以及截取字符串。
     #字符串的序列,即“索引”和“切片”,参考“1.3.列表、元组和字典.py.txt”的“序列”
     用法如: name = 'swaroop'; name[1]; name[1:3]; name[1:-1]

   11.str(anything)函数和 unicode(anything)函数
     Python 2有两个全局函数可以把对象强制转换成字符串:unicode()把对象转换成Unicode字符串,还有 str()把对象转换为非Unicode字符串。
     Python 3只有一种字符串类型,Unicode字符串,所以 str()函数即可完成所有的功能。(unicode()函数在Python 3里不再存在了。)

   另外:
     没有专门的char数据类型,确实没有需要有这个类型。
     单引号和双引号字符串是完全相同的——它们没有在任何方面有不同。
     正则表达式: 一定要用自然字符串处理正则表达式。否则会需要使用很多的反斜杠。
     使用 help(str) 可查看字符串对象定义的所有方法及属性。
     由于百分号有特殊作用,所以字符串里面要用百分号的话需要使用“%%”,如: "select * from my_table where name like '%%测试%%'"


字符串格式化控制: (未参考帮助文档,只是个人猜测)
   转义符 (Escape Sequence):
   \ddd     1到3位8进制数指定Unicode字符输出(如: “\127”显示“W”)
   \uxxxx   1到4位16进制数指定Unicode字符输出(Python3.x开始支持此写法,如: \u54C8 显示“哈”字)
   \xhh     16进制数指定Unicode字符输出(如: “\xe5\x93\x88”显示“哈”)
   \\       \
   \        \ (单独的一个斜杠也显示斜杠,即不后接有转移作用的字符时,作为斜杠使用)
   \'       '
   \"       "
   \a       字符: 0x07    响铃(ASCII控制字符)
   \b       字符: 0x08    退格(光标向左走一格)(ASCII控制字符)
   \f       字符: 0x0c    Formfeed(FF)(走纸转页,换页)(ASCII控制字符)
   \n       字符: 0x0a    换行(ASCII控制字符)
   \N{name} Unicode字符   只能针对Unicode
   \r       字符: 0x0d    回车
   \t       字符: 0x09    跳格(tab符号),水平制表符
   \v       字符: 0x0b    垂直制表符

   %%       %
   %d       输出10进制整数,只能是数字类型,输出字符串类型会出错;浮点类型的数字将被取整(直接删除小数部分)。
   %f,%F    以10进制输出浮点数,只能是数字类型,输出字符串类型会出错。
   %e,%E    以科学计数法输出10进制的浮点数,大小写的“e”反应在显示时科学计数法的“e/E”上,只能是数字类型。
   %a       Python3.0开始支持此写法,原样输出结果,字符串类型会加上单引号引起来。
   %o       (字母o)以8进制整数方式输出,只能是数字类型;浮点类型的数字将被取整(直接删除小数部分)。
   %x,%X    将数字以16进制方式输出,只能是数字类型;浮点类型的数字将被取整(直接删除小数部分)。
   %c       以字符方式输出,提供的类型必须是 char 或 int 。
   %s       直接输出字符串(可输出任何类型)
   %r       将字符串格式化输出(可输出任何类型,会自动用 repr 转换,输出;类似于 %s)
   注: 布尔类型的 True 或 False,用数字类型输出是 1或0,字符串输出是 True 或 False。


字符串 格式化
    格式化的符号用法参考上面的“字符串格式化控制表”

    1. %s 形式(简单占位符)
       使用“%控制符”可以格式化字符串,非常方便。
       如: str1 = "Swaroop's age is %d, weight is %f" % (5, 65.5)

    2. %(name)s 形式(名称传参)
       “%(name)控制符”可按名称传参数(不写名称是按位置传参数)
       如: str = "%(row)d Rows is %(value)s" % { 'value': 'kkkk', 'row': 22 }

    3. %n.mf 形式(制定输出长度的数值,补空格)
       如: '%6.2f' % 1.235 # 结果为: '  1.24'
       在这种形式中,在f的前面出现了一个类似小数的6.2它表示的意思是,总共输出的长度为6个字符,其中小数2位。
       常用用法如(只保留多少位小数,如两位小数): u'%.2f元' % 567.123

    4. %0n.mf 形式(制定输出长度的数值,并指定占位符)
       如:'%06.2f' % 1.235 # 结果为: '001.24'
       在6的前面多了一个0,表示如果输出的位数不足6位就用0补足6位。
       这一行的输出为'001.24',可以看到小数点也占用一位。
       类似于这里0这样的标记还有-、+。其中,-表示左对齐,+表示在正数前面也标上+号,默认是不加的。
       如:'%-6.2f' % 1.235 # 结果为: '1.24  '
       如:'%+6.2f' % 1.235 # 结果为: ' +1.24'

    5. %ns 形式(制定输出长度的字符串,补空格)
       %ns:如果字符串变量s不足n位的话,会先输出若干个空格后再输出str1
       如:'%8s:%6.1f' %('newsim', 9.51) # 结果为:'  newsim:   9.5'
       如:'%(name)8s:%(score)06.1f' %{'score':9.51, 'name':'newsim'} # 结果为:'  newsim:0009.5'

    6. %-ns 形式(制定输出长度的字符串,后面补空格)
       %-ns:与上述相反,先输出变量s,不足的然后用空格在后面补齐
       如:'%-8s:%-6.1f' %('newsim', 9.51) # 结果为:'newsim  :9.5   '
       如:'%(name)-8s:%(score)06.1f' %{'score':9.51, 'name':'newsim'} # 结果为:'newsim  :0009.5'

    7. %*.*f 形式
       有时候在%6.2f这种形式中,6和2也不能事先指定,会在程序运行过程中再产生,那怎么输入呢,当然不能用%%d.%df或%d.%d%f。
       可以用%*.*f的形式,当然在后面的“要输出的值组中”包含那两个*的值。
       比如:'%*.*f' % (6, 2, 2.345) 就相当于'%6.2f' % 2.345。
       不过如果记不住,或不想那么耐烦,完全可以全部用%s代替,或者用多个"+"来构造类似的输出字符串。
       如:'%*.*f' % (6, 2, 2.345) # 结果为:'  2.35'
       如:'%*s' % (6, 2.345) # 结果为: ' 2.345'
       如:'%*s,%*.*f' % (8, 'newsim', 6, 2, 2.345) # 结果为:'  newsim,  2.35'
       如:'%*s,%0*.*f' % (8, 'newsim', 6, 2, 2.345) # 结果为:'  newsim,002.35'
       如:'%-*s,%++*.*f' % (8, 'newsim', 6, 2, 2.345) # 结果为:'newsim  , +2.35'

    8. {number} 形式(按位占位符)
       {name} 形式(按名称传参)
       string.format()函数也可以格式化字符串,且有“按位”、“按名称”两种形式,还可以两种形式混用

       如: 'subtracting {0}, adding {1}'.format(1, 'haha') # 参数将对应到“{number}”的位置上,结果为:subtracting 1, adding haha
       如: "foo{1}{0}-{1}".format("bar", 6) # 结果为:foo6bar-6
       如:'Hi,{name},{message}'.format(name = 'Tom',message = 'How old are you?') # 参数不止数字,也可以是名称,结果为:Hi,Tom,How old are you?

       如:"-{arg!r}-".format(arg='test') # 参数也以指定格式,相当于“"-%(arg)r-"%{'arg':'test'}”,结果为:-'test'-
       如:"{{,}},-{0}-".format('test') # 两个“{”或者“}”表示大括号,结果为:{,},-test-
       如:'{0},I\'m {1},{message}'.format('Hello','Hongten',message = 'How are you!') # 混合使用'{0}','{name}'也可以,结果为:Hello,I'm Hongten,How are you!

       # 格式控制,数值
        import math
        print('PI is {0}.'.format(math.pi)) # PI is 3.14159265359.
        print('PI is {0!r}.'.format(math.pi)) # PI is 3.1415926535897931.
        print('PI is {0:.3f}.'.format(math.pi)) # PI is 3.142.
        print("PI is '{0:6.2f}'.".format(math.pi)) # PI is '  3.14'.
        print("PI is '{0:+6.2f}'.".format(math.pi)) # PI is ' +3.14'.
        print("PI is '{0:-6.2f}'.".format(math.pi)) # PI is '  3.14'.
        import datetime
        print("{0:now is: %Y-%m-%d %H:%M:%S}".format(datetime.datetime(2005, 2, 16, 23, 33,56))) # now is: 2005-02-16 23:33:56
        print("now is {0:%Y-%m-%d %H:%M:%S}".format(datetime.datetime(2005, 2, 16, 23, 33,56))) # now is 2005-02-16 23:33:56

       # 字典参数的输出
        table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}
        print('Jack:{0[Jack]}; Sjoerd:{0[Sjoerd]:10d}; Dcab:{0[Dcab]!r}'.format(table)) # Jack:4098; Sjoerd:      4127; Dcab:7678
        for name, phone in table.items():
            print('"{0:10}" ==> "{1:10d}"'.format(name, phone))
            # "Dcab      " ==> "      7678"
            # "Jack      " ==> "      4098"
            # "Sjoerd    " ==> "      4127"



字符串转换成数字
    float(str)     转换成浮点数,如, float("1e-1") 结果: 0.1
    int(str)       转换成整数,如, int("12") 结果: 12
    int(str,base)  转换成base进制的整数,如, int("11",2) 转换成2进制的整数,结果: 3
    long(str)      转换成长整数,Python3取消此语法,如, long("12L") 结果: 12L
    long(str,base) 转换成base进制的长整数,Python3取消此语法,如, long("11L",2) 结果: 3L


字符串用例
    name = 'Swaroop' # This is a string object

    # 检查字符串的开头部分
    if name.startswith('Swa'):  # 类似函数如 endswith()
        print('Yes, the string starts with "Swa"')

    # 检查是否包含有此内容
    if 'a' in name:
        print('Yes, it contains the string "a"')

    # 找出给定字符串的位置,找不到则返回-1
    if name.find('war') != -1:
        print('Yes, it contains the string "war"', 's')

    # join()函数把列表拼接起来
    delimiter = '; '
    mylist = ['Brazil', 'Russia', 'India', 'China']
    print(delimiter.join(mylist)) # 打印: Brazil; Russia; India; China

    # 大小写转换
    print("THIS IS TEST".lower())    # 转换成小写,打印: this is test
    print("this is test".upper())    # 转换成大写,打印: THIS IS TEST
    print("This Is Test".swapcase()) # 大小写互换,打印: tHIS iS tEST

    print("  This Is Test  ".strip()) # 去掉前后空格,打印: This Is Test

    # 格式化时 %r 与 %s 的区别
    s = '''
     哈哈, /,ss
    '''
    print('%r' % s) # 打印:'\n \xe5\x93\x88\xe5\x93\x88, /,ss\n'
    print('%s' % s) # 原样打印,包括换行


常用 string 函数
    下面所有范例,使用 s = 'python String function'

  1.字符串长度获取: len(str)
    例: print '%s length=%d' % (s,len(s)) # 打印: python String function length=22

  2.字母处理
    全部大写: str.upper()
    全部小写: str.lower()
    大小写互换: str.swapcase()
    首字母大写,其余小写: str.capitalize()
    首字母大写(每个词都这样): str.title()

    print '%s lower=%s' % (s,s.lower()) # 打印: python String function lower=python string function
    print '%s upper=%s' % (s,s.upper()) # 打印: python String function upper=PYTHON STRING FUNCTION
    print '%s swapcase=%s' % (s,s.swapcase()) # 打印: python String function swapcase=PYTHON sTRING FUNCTION
    print '%s capitalize=%s' % (s,s.capitalize()) # 打印: python String function capitalize=Python string function
    print '%s title=%s' % (s,s.title()) # 打印: python String function title=Python String Function
    import string; print string.capitalize(s) # 打印: Python string function


  3.格式化相关
    获取固定长度,右对齐,左边不够用空格补齐: str.ljust(width)
    获取固定长度,左对齐,右边不够用空格补齐: str.ljust(width)
    获取固定长度,中间对齐,两边不够用空格补齐: str.ljust(width)
    获取固定长度,右对齐,左边不足用0补齐

    print '%s ljust="%s"' % (s,s.ljust(40)) # 打印: python String function ljust="python String function                  "
    print '%s rjust="%s"' % (s,s.rjust(40)) # 打印: python String function rjust="                  python String function"
    print '%s center="%s"' % (s,s.center(40)) # 打印: python String function center="         python String function         "
    print '%s zfill="%s"' % (s,s.zfill(40)) # 打印: python String function zfill="000000000000000000python String function"
    import string; print string.zfill(s, 40) # 打印: 000000000000000000python String function


  4.字符串搜索相关
    搜索指定字符串,没有返回-1: str.find('t')
    指定起始位置搜索: str.find('t',start)
    指定起始及结束位置搜索: str.find('t',start,end)
    从右边开始查找: str.rfind('t')
    搜索到多少个指定字符串: str.count('t')
    上面所有方法都可用 index 代替,不同的是使用 index 查找不到会抛异常,而 find 返回-1

    print '%s find nono=%d' % (s,s.find('nono')) # 打印: python String function find nono=-1
    print '%s find t=%d' % (s,s.find('t')) # 打印: python String function find t=2
    print '%s find t from %d=%d' % (s,3,s.find('t',3)) # 打印: python String function find t from 3=8
    print '%s find t from %d to %d=%d' % (s,1,2,s.find('t',1,2)) # 打印: python String function find t from 1 to 2=-1
    #print '%s index nono ' % (s,s.index('nono',1,2))
    print '%s rfind t=%d' % (s,s.rfind('t')) # 打印: python String function rfind t=18
    print '%s count t=%d' % (s,s.count('t')) # 打印: python String function count t=3
    print s.index('on') # 打印: 4
    import string; print string.find(s, 't') # 打印: 2


  5.字符串替换相关
    替换old为new: str.replace('old','new')
    替换指定次数的old为new: str.replace('old','new',maxReplaceTimes)
    另一种写法: import string; string.replace(str,"old","new")

    print '%s replace t to *=%s' % (s,s.replace('t', '*')) # 打印: python String function replace t to *=py*hon S*ring func*ion
    print '%s replace t to *=%s' % (s,s.replace('t', '*',1)) # 打印: python String function replace t to * once=py*hon String function
    import string; print '%s replace t to *=%s' % (s, string.replace(s,"t","*")) # 打印: python String function replace t to *=py*hon S*ring func*ion


  6.字符串去空格及去指定字符
    去两边空格: str.strip()
    去左空格: str.lstrip()
    去右空格: str.rstrip()
    去两边字符串: str.strip('d'),相应的也有 lstrip, rstrip

    s=' python String function '
    print '%s strip="%s"' % (s,s.strip()) # 打印: python String function  strip="python String function"
    print '%s strip="%s"' % (s,s.strip().strip('n')) # 打印: python String function  strip="python String functio"
    print '%s lstrip="%s"' % (s,s.lstrip()) # 打印: python String function  lstrip="python String function "
    print '%s lstrip="%s"' % (s,s.strip().lstrip('py')) # 打印: python String function  lstrip="thon String function"
    import string; print '%s strip="%s"' % (s, string.strip(s)) # 打印: python String function  strip="python String function"


  7.按指定字符分割字符串为数组:
    str.split(' ')
    split(string,sep=None,maxsplit=-1)   默认按空格分隔(sep=' ')

    s='a b-c de-f'
    print '"%s" split=%s' % (s,s.split()) # 打印: "a b-c de-f" split=['a', 'b-c', 'de-f']
    print '"%s" strip=%s' % (s,s.split('-')) # 打印: "a b-c de-f" strip=['a b', 'c de', 'f']
    import string; ip="192.168.3.3"; print(string.split(ip,'.')) # 打印:  ['192', '168', '3', '3']
    print("192.168.3.3".split('.',1)) # 部分分隔,打印:  ['192', '168.3.3']


  8.字符串判断相关
    是否以start开头: str.startswith('start')
    是否以end结尾: str.endswith('end')
    是否全为字母或数字: str.isalnum()
    是否全字母: str.isalpha()
    是否全数字: str.isdigit()
    是否全小写: str.islower()
    是否全大写: str.isupper()

    s='python String function'
    print '"%s" startwith t="%s"' % (s,s.startswith('t')) # 打印:"python String function" startwith t="False"
    print '"%s" startwith pyt="%s"' % (s,s.startswith('pyt')) # 打印:"python String function" startwith pyt="True"
    print '"%s" endwith d="%s"' % (s,s.endswith('d')) # 打印:"python String function" endwith d="False"
    print '"%s" endwith n="%s"' % (s,s.endswith('n')) # 打印:"python String function" endwith n="True"
    print '"%s" isalnum="%s"' % (s,s.isalnum()) # 打印:"python String function" isalnum="False"
    s='pythonStringfunction'
    print '"%s" isalnum="%s"' % (s,s.isalnum()) # 打印:"pythonStringfunction" isalnum="True"
    print '"%s" isalpha="%s"' % (s,s.isalpha()) # 打印:"pythonStringfunction" isalpha="True"
    print '"%s" isupper="%s"' % (s,s.isupper()) # 打印:"pythonStringfunction" isupper="False"
    print '"%s" islower="%s"' % (s,s.islower()) # 打印:"pythonStringfunction" islower="False"
    print '"%s" isdigit="%s"' % (s,s.isdigit()) # 打印:"pythonStringfunction" isdigit="False"
    s='3423'
    print '"%s" isdigit="%s"' % (s,s.isdigit()) # 打印:"3423" isdigit="True"



str, unicode 对象的 encode 和 decode 方法
    python2 中的 str 对象其实就是"8-bit string" ,字节字符串,本质上类似java中的 byte[]。
    而 python2 中的 unicode 对象应该才是等同于java中的 String 对象,或本质上是java的 char[]。

    str.decode 方法和 unicode.encode 方法是最常用的,
    简单说来就是,python内部表示字符串用 unicode(其实python内部的表示和真实的 unicode 是有点差别的,对我们几乎透明,可不考虑),和人交互的时候用 str 对象。
    s.decode --------> 将 s 解码成 unicode, 参数指定的是 s 本来的编码方式。这个和 unicode(s,encodename) 是一样的。
    u.encode --------> 将 unicode 编码成 str 对象,参数指定使用的编码方式。


乱码/编码 问题
    1、写的代码模块需要指定编码
       如果代码没有指定 coding, python 就默认所有的字符为 ASCII 码,
       ASCII 码只支持256个字符,ASCII码不支持中文,所以就报错。
       所以要在代码前写上“#coding:utf-8” 或 “#coding:gbk” 或 “#-*- coding:cp936 -*-”
       但通用写上“#coding:utf-8”

    2、代码前也可以写#coding:gbk
       但要保证你的代码文件的保存格式为gbk.这个在windos下会出现这样的问题。

    3、python2 内部所有编码统一为 unicode 即可解决乱码问题
       unicode 可以处理世界上所有语言的字符。
       utf-8 为 unicode 的一种实现形式,所以需要在代码前写上 #coding:utf-8

    4、编码转换
       牢记 python2 内部编码为 unicode.
       其它的编码 decode() 为 unicode, 再编码 encode() 为你指定的编码,就不会出现乱码。
       如: s = s.decode('gbk').encode('utf-8') # utf-8 也可以写成 utf8

       不知道原本是什么编码,可以这样写:
       import sys; s = s.decode(sys.stdin.encoding).encode('utf8')
       推荐的写法: s = unicode(s).encode('utf8')

    5、网页采集时
       代码指定#coding:utf-8
       如果网页的编码为gbk
       需要这样处理:
       html = html.decode('gbk').encode('utf-8')

    6、字典等key或值的汉字问题
       #coding:utf-8
       dict1 ={1:'python周末培训班',2:'咨询'}

       print dict1
       # 这样输出的没有显示汉字,是显示汉字的其它编码

       dict2 ={1:'python视频培训班',2:'咨询'}
       for key in dict2:
           print dict2[key]

    7、unicode 的汉字编码写到文本文件中
       需要根据文本文件的编码进行转换
       可以 encode('utf-8') 或 encode('gbk')

    8、获取 unicode 编码
        print repr(u'中国') # 打印:u'\u4e2d\u56fd'

    总结:凡是报错信息中出现的错误包含“ASCII”,就是没有指定汉字编码的问题。
  

 

posted on 2017-08-19 09:42  喵吉欧尼酱  阅读(491)  评论(0)    收藏  举报