chevron-up bell reply instagram twitter2 feed3 finder search-25px-p0
暂无公告

Python 学习——字符串

2015-06-05 09:06

字符串(String)

        字符串是一个字符的序列,使用成对的单引号或双引号包裹内容:

str_1 = "Hello world"
str_2 = 'Hello world'

也可以用三引号表示(’’’或”””),用三引号表示字符串可以保留字符串中的全部格式信息:

str_3 = """
  this is 
a test
today
"""

注:无论是单引号或是双引号,都必须成对出现。不能单独出现。如果在字符串中还存在”或者’则需要使用转义字符:

str_4 = 'hello/'s world'

基本的字符串运算

长度len()函数:
str_5 = "hello world"
print len(str_5)

输出结果image

拼接(+)
frist_name = 'xiao'
name = 'ming'
print frist_name + name

输出结果image

重复(*)
s = 'hello'
print s * 3

输出结果image

成员运算符(in):

判断一个字符串是否是另一个字符串的子串,返回值Ture或者False

s = 'hello'
print 'h' in s

输出结果image

也可以利用in判断字符串是否是另一个字符串的子串,Python是大小写敏感的语言,所以只有大小写一致的话才可以返回Ture

for语句遍历字符串

作用:枚举字符串的 每个字符。

s = 'hello'
for chr in s:
	print chr

运行结果image

案例

编写一个函数,计算一个字符串中元音字母的数目。(元音字母aeiou或者AEIOU)

def vowels_count(s):
	count = 0
	for chr in s:
		if chr in 'aeiouAEIOU':
			count += 1
	return count

print vowels_count('hello world')

输出结果:image

字符串索引

字符串中每个字符都有一个索引值(下标),索引从0(前向)或-1(后向)开始

froward index 0 1 2 3 4
  h e l l o
backward index -5 -4 -3 -2 -1

索引运算符 [ ]

例如:

s = 'hello'
print s[0],s[-1]

运行结果image

注意,如果索引值超出索引范围的话,程序会报错,报错如下:image

切片(Slicing)

选择字符串的子序列

语法[start:finish]

start:子序列开始位置的索引值

finish:子序列结束位置的下一个字符索引值。例如

s = 'hello'
print s[0:2]


运行结果:image

注:如果不提供start或者finish,则默认start为第一个字符开始,finish为最后一个字符。

        切片操作也可以接受第三个参数,[start:finish:countBy],其默认值为1。例如:

s = 'hello'
print s[0:5:2]

运行结果:image

注:countBy可以为负数。如果值为-1的话则为获取字符串的逆序。例如:

s = 'hello'
print s[::-1]

image

字符串是不可变的,字符串一旦定义,则不可改变。即采用下标赋值的办法不可以改变字符串

例如:

s = 'hello'
s[-1] = 'a'
print s

运行结果:image

字符串的方法

replace —— 替换

如果想要改变字符串内部的字符,可以使用字符串方法(对象提供的函数)

使用方法:my_str.replace(old, new),生成一个新的字符串,其中使用new替换old字符串。

例如:

s = 'hello'
print s.replace('l','a')#使得s生成了一个新的字符串
print s #s的值仍然为hello
s = s.replace('l','a')#如果想修改字符串则只能s进行赋值
print s

运行结果image

注:replace方法返回一个新的字符串,原字符串内容不变,要想改变原来的字符串,则需要将新生成的字符串重新赋值给原来的字符串。

使用my_str.replace(old, new),方法将替换所有的old为new。

find —— 查找

例如:

s = 'hello'
print s.find('l')

运行结果:image

返回所提供字符第一次出现的下标值,上例中参数为 l ,l 第一次出现的下标为2所以返回2

split —— 切分

例如:

s = 'hello world'
print s.split()

运行结果:image

如果不提供任何参数,则split从空格处进行切分。

也可以提供一个参数,按照某一个特定字符进行切分,例如:

s = 'www.google.com'
print s.split('.')

运行结果:image

也可以提供两个参数,按照某一特定字符切分 n 次,例如:

s = 'www.google.com'
print s.split('.',1)#只进行一次切分结果

运行结果image

按照某一字符串进行切分n次,例如:

s = 'baidu||google||360||soso||yahoo'
print s.split('||',2)#从||处切分2次,不提供后面的参数可全部切分

运行结果:image

按照某一特定字符分割n次,将得到的值分别赋值给n+1个字符串。

s = 'baidu||google'
str_1, str_2 = s.split('||',1)
print str_1
print str_2

运行结果:image


实例1——人名游戏

读取人名列表names.txt然后将人名转换为首字母大写,其他字母小写的格式。

f = open('names.txt','r') #打开names.txt 只读模式r  可写模式w
for line in f: #按行遍历names.txt
    line =line.strip()#strip方法去除空格,回车    
    print line.title()#title方法转换为首字母大写其与字母小写
f.close()#关闭文件
  1. 要点:
  • 文件打开open函数返回的是一个对象,将该对象赋值给f
  • strip方法,用于一处字符串头尾指定的字符,没有任何参数时,默认删除空白符,包括:
    n  换行    r  回车    t 水平制表   
    strip也可以接受字符串参数,将删除操作字符串头尾出现的指定字符,例如
    str = "0000000hello!!!0000000"
    print str.strip( '0' )

    运行结果image

判断回文字符串

在刚才例程的基础上,定义一个函数is_panlidrom,判断字符串是否为回文字符串,如果是返回TRUE否则返回FALSE,最后打印回文字符串。

分析:所谓回文字符串,指从头至尾和从尾至头相同的字符串,例如,bob就是一个回文字符串。

根据前文知识可得出,如果str[0] == str[-1] and str[1] == str[-2] and str[2] == str[-3]……str[len(str)/2] == str[-len(str)/2+1]条件全部成立时,str为回文字符串,否则不是。因此例程如下:

f = open('names.txt','r') #打开names.txt 只读模式r  可写模式w

def is_panlidrom(name):
    low = 0#定义索引最小值
    high = len(name) - 1#定义索引最大值,因为从零开始,所以最大为下标减一
    while low < high:#当最小值小于最大值时,执行循环
        if name[low] != name[high]:#第一个字符不等于最后一个字符,返回FALSE 不再继续判断
            return False
        low += 1#最小值加一
        high -= 1#最大值减一
    return True
for line in f:
    line = line.strip()#移除头尾的空格回车等字符
    if is_panlidrom(line):#调用函数
        print line
f.close()

将其改造成递归版,思路如下:

根据递归掐头去尾留中间的方法,确定跳出递归的条件为字符串的长度为1的时候,返回其是回文字符串,否则进行判断str[0:-1]是否为回文字符串,依次递归:

f = open('names.txt','r') #打开names.txt 只读模式r  可写模式w
def is_panlidrom_rec(name):
    if len(name) <= 1:#如果字符串长度为1,则直接返回True
        return True
    else:
        if name[0] != name[-1]:#否则判断第一位和最后一位是否相等,如果否,返回FALSE
            return False
        else:
            return is_panlidrom_rec(name[1:-1])#否则判断name[1:-1]是否为回文字符串

for line in f:
    line = line.strip()
    if is_panlidrom_rec(line):
        print line        
f.close()

更简单的方法

f = open('names.txt','r') #打开names.txt 只读模式r  可写模式w
for line in f:
    line = line.strip()
    if line == line[::-1]:#切片求逆序
        print line        
f.close()

字符串比较大小

字符大小比较的实质就是比较其ASCII码的大小,字符串大小比较是按照字典序排序。

首先比较两个字符串的第一个字符是否相同,如果相同,则比较下一个,如果不同,则字符串的大小关系由这两个字符的关系决定。

如果其中一个字符为空(较短),则其更小。

'a' <  'b'
True
'aaab'<'aaac'
True
'aa' < 'aaab'
Ture
'abc > 'bcd'
False

实例:定义函数is_ascending。判断传入字符串是否是升序排列

f = open('names.txt')#打开文件
def is_ascending(name):
    p = name[0] #p赋值为第一个字符
    for c in name:
        print c,p
        if p > c:#如果c,大于第一个字符,则返回否
            return False    
        p =  c #将p赋值为c 
    return True
for line in f:
    line = line.strip()
    if is_ascending(line):
        print line
f.close()

以abc作为测试用例验证is_ascending函数。将参数’abc’传入is_ascending,其执行过程如下:

第一次循环时,p = a c = a 则 p = c,不满足p > c的条件,因此不执行return False语句。执行p = c,此时,p = a。

第二次循环时,p = a c = b 则 p < c,不满足p > c的条件,因此不执行return False语句。执行p = c,此时,p = b。

第三次循环时,p = b c = c 则 p< c,不满足p > c的条件,因此不执行return False语句。执行p = c,此时,p = c。但由于len(‘abc’)=3,因此循环到此结束。跳出循环,直接执行return True

字符串格式化(Formatting)

详见之前日志python 格式化操作手册(string formatter)

加贝

5 Comments On Python 学习——字符串

  1. 不知怎么就进来了,先看看

  2. 我就是随便看看

  3. 拜读一下,哈哈

  4. 持续更新,持续来访。

  5. 先谢谢了,有收获

发表评论