Python字符串比较中存在的问题,这是使用unicode编码 的字符串中都有的情况:
1 简介
字符串是str类型的unicode字符序列。str可以作为一个函数调用,如果参数是空则返回一个空字符串对象;如果给定一个字符串,则返回该字符拷贝的字符串对象。str还可以作为类型转换函数使用。将传入的参数转换为字符串表示。
2 字符串定义。使用单引号、双引号、三引号定义。如果在字符串内部使用引号,只要与定义字符串时使用的引号不同,可以直接在字符串内部使用,如:
>>>s="My name's Rebort"
可以在双引号包围的字符串中任意使用单引号,如果是单引号定义字符串,可以在其内部任意使用双引号。但如果是单引号定义字符串,在内部还要使用单引号,或者双引号定义字符串,还要在其内部使用双引号,就需要使用转义符号
>>> s = 'My name\'s Rebort'
>>> s
"My name's Rebort"
在三引号内部定义的字符串可以任意使用单、双引号,但不能够在内部出现连续三个与定义字符串时使用的引号相同的情况
3 转义序列:
转义字符 含义
\newline 忽略换行
\\ \
\' '
\" "
\a ASCII蜂鸣
\b ASCII退格
\f ASCII走纸
\n ASCII换行
\N{name} 给定名称的unicode字符
\r ASCII回车符
\t ASCII制定符
\ooo 给定八进制字符
\uhhhh 给定16位十六进制unicode字符
\Uhhhhhhhh 给定32位十六进制unicode字符
\xhh 给定8位十六进制unicode字符
\v 垂直制表符
避免转义的方法是使用原始字符或三引号字符串,所谓原始字符串是的r引导的字符串。如:
phone2 = re.compile(r"^((?:[()\d+[]])?\s*\d+(?:-\+)?)$")
4 字符串分片与步距
字符串是一种固定长度的序列,一切适用于固定长度序列的操作方法都适用于字符串。在序列中常用的分片操作同样在字符串中也非常常用
如:
s = 'Light ray'
其字符索引方式如下
s[-9] s[-8] s[-7] s[-6] s[-5] s[-4] s[-3] s[-2] s[-1]
L i g h t r a y
s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] [s8]
数据分片操作如下:
s[start]
s[start:end]
s[start:end:step]
示例如下:
>>> s ='Light ray'
>>> s[1]
'i'
>>> s[1:8]
'ight ra'
>>> s[1:-1]
'ight ra'
>>> s[1:-1:2]
'ih a'
其中第三种语法解释如下:
s[start:end:step]是指从字符串s中,先取出从start开始到end前结束的子串,再从这个子串中每隔|step|的长度取一个字符,若step为正,从前往后进行;若step为负,从后往前进行
5 字符串操作方法:
语法 | 功能 | 示例 |
s.capitalize() | 返回s中原内容首字符大写的形式的副本 | >>> s = 'light ray' >>> s.capitalize() 'Light ray' |
s.center(width,chr) | (1)当 width>len(s)时,返回长度为width,原来内容居中显示的字符串 如果指定了chr,则用指定内容填充,如果没有指定,则用空格 (2)当width=<len(s)时,返回原来的字符串 | >>> s.center(20) ' light ray ' >>> s.center(20,'=') '=====light ray======' >>> s.center(20,'-') '-----light ray------' >>> s.center(2) 'light ray' |
s.count(t,start,end) | 统计子串t在s中start开始end结束的位置中出现的次数,start、end可选 | >>> s = 'light ray' >>> s.count('ig') 1 >>> s.count('ht',2,-1) 1 |
s.encode(x,err) | 返回由x指定编码格式的一个字符串,并可以根据err参数处理错误 | |
s.endswith(x,start,end) | 如果字符串s(或s的start:end)部分以x结尾,返加True,否则返回False | >>> s = 'light ray' >>> s.endswith('ray') True >>> s.endswith('a') False |
s.expandtabs(size) | 将s中的制表符用size个空格代替,然后返回这个字符串 | >>> s = 'light\tray' >>> print(s) light ray >>> s.expandtabs(2) 'light ray' |
s.find(t,start,end) | 返回t在s(或者s的start:end分片)最左边的位置,没有找到返回-1 | >>> s = 'light ray' >>> s.find('ray') 6 |
s.format() | 单独讨论 | |
s.index(t,start,end) | 返回t在s(或者s[start:end])中最左边的位置,如果没有找到,返回ValueError异常 | >>> s = 'light ray' >>> s.index('igh') 1 >>> s.index('aaaa') Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: substring not found |
s.isalnum() | 如果s非空,并且每个字符都是字母数字,返回True | |
s.isalpha() | 如果s非空,并且每个字符都是非数字字符,返回True | |
s.isdigit() | 如果s非空,并且每个字符都是一个ASCII数字,返回True | |
s.isidentifier() | 如果s非空,并且是一个有效的标识符,返回True | |
s.islower() | 如果s至少有一个可小写的字符并且所有可小写的字符都小写,返回True | |
s.isnumeric() | s非空,并且其中每个字符都是数值型的Unicode字符,比如数字或小写,就返回True | |
s.isprintable() | s非空,并且第个字符都是可打印的,则返回True | |
s.isspace() | s非空,且其中的每个字符都是空格,返回True | |
s.istitle() | 如果s是一个非空且首字符大小的字符串返回True | |
s.isupper() | s中至少有一个大写的字符,且s中所有可以大写的字符都大写,返回True | |
s.join(seq) | 以s为分隔符,将join中的列表内容连接成一个字符串 | |
s.ljust(width,char) | 返回长度为width的字符串,该字符串中原来的内容居左对齐,其余内容用空格(或char) 填充。 | |
s.lower() | 返回s的小写副本 | |
s.maketrans() | ||
s.partition(t) | 返回一个三元组,字符中s中t左边内容,t,t右边内容。如果t在s中不存在则返回s和 两个空字符串 | >>> s = "There is a table in the middle of the room" >>> s.partition('in') ('There is a table ', 'in', ' the middle of the room') >>> s.partition('kkkk') ('There is a table in the middle of the room', '', '') |
s.replace(t,u,n) | 返回s的一个副本,s中的t用r替换 | >>> s = 'my name\'s Hans' >>> s.replace('Hans','Jack') "my name's Jack" |
s.split(t,n) | 返回一个字符串列表,要示在字符串t处分隔n次,如果没有指定n则尽可能多的分隔 如果没有指定参数,则在空白处分隔。 | >>> s='one two three four five' >>> s.split() ['one', 'two', 'three', 'four', 'five'] >>> s= 'one,two,three,four,five,six,seven,eight,nine,ten' >>> s.split(',',3) ['one', 'two', 'three', 'four,five,six,seven,eight,nine,ten'] |
s.splitlines(f) | 返回在行终结符处分割产生的列表,并剥离行终结符(除非f为True) | >>> s = '''Excuse me!\nYes?\nIs this your handbag?\nPardon?\nIs this your handbag?\nYes.\nIt is.''' >>> s.splitlines() ['Excuse me!', 'Yes?', 'Is this your handbag?', 'Pardon?', 'Is this your handbag?', 'Yes.', 'It is.'] |
s.startswith(x,start,end) | 测试字符串(或s[start:end])是否以经开始 | >>> s = 'I am a new student' >>> s.startswith('I') True >>> s.startswith('am',2) True |
s.strip(chars) | 返回s的一个副本,并将开始与结尾处的空白符(或者字符串chars中的字符移除.s.lstrip()只清除左端,s.rstrip()只清除左端 | |
s.swapcase() | 返回s中大小写互换的副本 | >>> s = 'This is my book' >>> s.swapcase() 'tHIS IS MY BOOK' |
s.title() | 返回s的首字母大写副本 | |
s.translate() | ||
s.upper() | 返回字符串s的大写版本 | |
s.zfill(w) | 如果len(s)<w,返回前端以0填充的s副本 | >>> s = '123' >>> s.zfill(10) '0000000123' |
注意:
如果要多次连接多个字符串,使用s.join()方法,如:
>>> li=['I','am','a','new','student']
>>> ' '.join(li)
'I am a new student'
这样的效率要高于使用加号连接字符串
s.index(c)与s.find(c)作用相同,都是在s中找出与c子串第一次出现的位置,不同是在c在s中不存在时,s.index()产生异常,s.find()返回-1