python 通关字符串操作方法详解-大量案例

IT入门加星标,提升编程技能

IT入门(ID:learncode)整理 

原作者:战争热诚

  字符串序列用于表示和存储文本,python中字符串是不可变对象。字符串是一个有序的字符的集合,用于存储和表示基本的文本信息,一对单,双或三引号中间包含的内容称之为字符串。其中三引号可以由多行组成,编写多行文本的快捷语法,常用文档字符串,在文件的特定地点,被当做注释。便捷的多行注释。

Python实际三类字符串:

  1.通常意义字符串(str)

  2.原始字符串,以大写R 或 小写r开始,r'',不对特殊字符进行转义

  3.Unicode字符串,u'' basestring子类

  python中字符串支持索引、切片操作。

根据python3.x的字符串源码文件可见,总共44个方法,查找列出如下:

image
image

  总结上面的用法,对其分个类,我们可以把字符串操作分为字符串的替换、删除、截取、复制、连接、比较、查找、分割等

  但是,首先得判断这个对象是不是字符串,方法如下:

如何判断一个对象是不是字符串

python中字符串有两重,一种是str,一种是unicode。那如何判断一个对象是不是字符串呢?应该使用isinstance(s,basestring),而不是isinstance(s,str)。

看下面例子

 >>>a = 'hi'
 >>>isinstance(a,str)
 True
 >>>b = u'Hi'
 >>>isinstance(b,str)
 False
 >>>isinstance(b,basestring)
 True
 >>>isinstance(b,unicode)
 True
 >>>isinstance(a,unicode)
 False

  要正确判读一个对象是不是字符串,要有basestring,因为basestring是str和unicode的基类,包含了普通字符串和unicode类型。

如何去掉字符串的双引号

a = ''string''print(a,type(a))b = eval(a)print(b,type(b))

结果:'string' <class 'str'>string <class 'str'>

下面讲str对象的基本用法

字符串的基本用法可以分以下五类,即性质判定、查找替换、分切与连接、变形、填空与删减。

(a)性质判定

性质判定有以下几个方法。

isalnum():是否全是字母和数字,并至少有一个字符
isalpha():是否全是字母,并至少有一个字符
isdigit():是否全是数字,并至少有一个字符
islower():字符串中字母是否全是小写
isupper():字符串中字母是否全是小写
isspace():是否全是空白字符,并至少有一个字符
istitle():判断字符串是否每个单词都有且只有第一个字母是大写
startswith(prefix[,start[,end]]):用于检查字符串是否是以指定子字符串开头,如果是则返回 True,否则返 回 False。如果参数 start 和 end 指定值,则在指定范围内检查。

endswith(suffix[,start[,end]]):用于判断字符串是否以指定后缀结尾,如果以指定后缀结尾返回True,否则返回False。可选参数'start'与'end'为检索字符串的开始与结束位置。

is*()这些都比较简单,从字母的字面上就可以理解,with()函数可以接受start和end参数,如果善加利用可以优化性能。另外,从python 2.5版本起,with()函数族的第一个参数可接受tuple类型实参,当实参中某个元素匹配时,即返回True

(b)查找与替换

count(sub[,start[,end]]):统计字符串里某个字符sub出现的次数。可选参数为在字符串搜索的开始与结束位置。这个数值在调用replace方法时用得着。

find(sub[,start[,end]]):检测字符串中是否包含子字符串sub,如果指定start(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果包含子字符串返回开始的索引值,否则返回 -1

index(sub[,start[,end]]):跟find()方法一样,只不过如果sub不在 string中会抛出ValueError异常。

rfind(sub[,start[,end]]):类似于 find()函数,不过是从右边开始查找。

rindex(sub[,start[,end]]):类似于 index(),不过是从右边开始。

replace(old,new[,count]):用来替换字符串的某些子串,用new替换old。如果指定count参数话,就最多替换count次,如果不指定,就全部替换

前面五个方法都可以接受start、end参数,善加利用可以优化性能。对于查找某个字符串中是否有子串,不推荐使用index族和find族方法,推荐使用in和not in操作

(c)分切与连接

partition(sep):用来根据指定的分隔符将字符串进行分割,如果字符串包含指定的分隔符,则返回一个3元的元组,第一个为分隔符左边的子串,第二个为分隔符本身,第三个为分隔符右边的子串。如果sep没有出现在字符串中,则返回值为(sep,',')。partition() 方法是在2.5版中新增的。

rpartition(sep):类似于 partition()函数,不过是从右边开始查找.

splitness([keepends]):按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表,如果参数        keepends 为 False,不包含换行符,如果为 True,则保留换行符。

split(sep[,maxsplit]]):通过指定分隔符对字符串进行切片,如果参数maxsplit 有指定值,则仅分隔 maxsplit 个子字符串,返回分割后的字符串列表。

rsplit(sep[,maxsplit]]):同split(),不过是从右边开始。

看下面例子

str1 = 'ab c\n\nde fg\rkl\r\n'
print str1.splitlines();

str2 = 'ab c\n\nde fg\rkl\r\n'
print str2.splitlines(True)

  输出如下:

['ab c', '', 'de fg', 'kl']['ab c\n', '\n', 'de fg\r', 'kl\r\n'] 

split()函数有个小陷阱,比如对于字符串s,s.split()和s.split(' ')的返回值不同。看下面代码

s = '  hello world'#前面有两个空格
print s.split()
print s.split(' ')

输出结果如下

['hello', 'world']['', '', 'hello', 'world']

  这是为什么呢?原因在于:当忽略sep参数或者sep参数为None时与明确给sep赋予字符串值时,split()采用了两种不同的算法。对于前者,split()先除去两端的空白符,然后以任意长度的空白符串作为界定符分切字符串(即连续空白符串会被单一空白符看待);对于后者则认为两个两个连续空白符之间存在一个空字符串,因此对空字符串,它们的返回值也不同。

>>>'.split()
[]
>>>''.split(' ')
['']

(d)变形

lower():转换字符串中所有大写字符为小写。

upper():将字符串中的小写字母转为大写字母。

capitalize():将字符串的第一个字母变成大写,其他字母变小写。对于 8位字节编码需要根据本地环境。

swapcase():用于对字符串的大小写字母进行转换,大写转小写,小写转大写。

title():返回'标题化'的字符串,就是说所有单词都是以大写开始,其余字母均为小写。

  这些都是大小写切换,title()并不能除去字符串两端的空白符也不会把连续空白符替换成一个空格,如果有这样的需求,可以用string模块的capwords(s)函数,它能除去两端空白符,并且能将连续的空白符用一个空格符代替。看下面例子:

#coding=utf-8import strings = '   hello   world'print s.title()print string.capwords(s)

输出结果如下:

   Hello   World
Hello World

(e)删减与填充

strip([chars]):用于移除字符串头尾指定的字符(默认为空格),如果有多个就会删除多个。

lstrip([chars]):用于截掉字符串左边的空格或指定字符。

rstrip([chars]):用于截掉字符串右边的空格或指定字符。

center(width[,fillchar]):返回一个原字符串居中,并使用fillchar填充至长度 width 的新字符串。默认填充字符为空格

ljust(width[,fillchar]):返回一个原字符串左对齐,并使用fillchar填充至指定长度的新字符串,默认为空格。如果指定的长度小于原字符串的长度则返回原字符串。

rjust(width[,fillchar]):返回一个原字符串右对齐,并使用fillchar填充至长度 width 的新字符串。如果指定的长度小于字符串的长度则返回原字符串。

zfill(width):返回指定长度的字符串,原字符串右对齐,前面填充0 `expandtabs([tabsize])`:把字符串中的 tab 符号('\t')转为适当数量的空格,默认情况下是转换为8``个。

|

(f)字符串切片

切片操作(slice)可以从一个字符串中获取子字符串(字符串的一部分)。我们使用一对方括号、起始偏移量start、终止偏移量end 以及可选的步长step 来定义一个分片。

格式:[start:end:step]

  • · [:] 提取从开头(默认位置0)到结尾(默认位置-1)的整个字符串

  • · [start:] 从start 提取到结尾

  • · [:end] 从开头提取到end - 1

  • · [start:end] 从start 提取到end - 1

  • · [start:end:step] 从start 提取到end - 1,每step 个字符提取一个

  • · 左侧第一个字符的位置/偏移量为0,右侧最后一个字符的位置/偏移量为-1

 str = '0123456789′ print str[0:3] #截取第一位到第三位的字符 print str[:] #截取字符串的全部字符 print str[6:] #截取第七个字符到结尾 print str[:-3] #截取从头开始到倒数第三个字符之前 print str[2] #截取第三个字符 print str[-1] #截取倒数第一个字符 print str[::-1] #创造一个与原字符串顺序相反的字符串 print str[-3:-1] #截取倒数第三位与倒数第一位之前的字符 print str[-3:] #截取倒数第三位到结尾 print str[:-5:-3] #逆序截取,截取倒数第五位数与倒数第三位数之间<br>print str[::2] #按照步长为二,返回所有值

(g) maketrans和translate的用法

开发敏感词语过滤程序,提示用户输入内容,如果用户输入的内容中包含特殊的字符:
如:'苍老师'“东京热”,则将内容替换为***

sentence_input  = input('请输入:')
sensitive_varcabulary1 = str.maketrans('苍老师','***')
sensitive_varcabulary2 = str.maketrans('东京热','***')
new_sentence = sentence_input.translate(sensitive_varcabulary1).translate(sensitive_varcabulary2)
print(new_sentence)
# 请输入:dads大大的苍老师
# dads大大的***

(h)字符串格式化(format)

    用法:它通过 {} 和 : 代替传统的 % 方法

  1,使用关键字参数

  要点:关键字参数值要对得上,可用字典当关键字参数传入值,字典前加**即可

>>> hash = {'name':'hoho','age':18}>>> 'my name is {name},age is {age}'.format(name='hoho',age=19)'my name is hoho,age is 19'>>> 'my name is {name},age is {age}'.format(**hash)'my name is hoho,age is 18'

  2,填充与格式化

  :[填充字符][对齐方式 <^>][宽度]

'{:<20}'.format(10)           #左对齐
'10                  '
'{:>20}'.format(10)           #右对齐
'                  10'
'{:^20}'.format(10)           #居中对齐
'         10         '

  3,使用位置参数

  要点:从以下例子可以看出位置参数不受顺序约束,且可以为{},只要format里有相对应的参数值即可,参数索引从0开,传入位置参数列表可用*列表

>>> li = ['hoho',18]>>> 'my name is {} ,age {}'.format('hoho',18)'my name is hoho ,age 18'>>> 'my name is {1} ,age {0}'.format(10,'hoho')'my name is hoho ,age 10'>>> 'my name is {1} ,age {0} {1}'.format(10,'hoho')'my name is hoho ,age 10 hoho'>>> 'my name is {} ,age {}'.format(*li)'my name is hoho ,age 18'

  4,精度与进制

>>> '{0:.2f}'.format(1/3)
'0.33'
>>> '{0:b}'.format(10)    #二进制
'1010'
>>> '{0:o}'.format(10)     #八进制
'12'
>>> '{0:x}'.format(10)     #16进制
'a'
>>> '{:,}'.format(12369132698)  #千分位格式化
'12,369,132,698'

  5,使用索引

>>> li['hoho', 18]>>> 'name is {0[0]} age is {0[1]}'.format(li)'name is hoho age is 18

(i)常用字符串技巧

1,反转字符串

>>> s = '1234567890'
>>> print s[::-1]
0987654321

2,关于字符串的拼接

尽量使用join()链接字符串,因为’+’号连接n个字符串需要申请n-1次内存,使用join()需要申请1次内存。

3,固定长度分割字符串

>>> import re
>>> s = '1234567890'
>>> re.findall(r'.{1,3}', s)  # 已三个长度分割字符串
['123', '456', '789', '0']

4,使用()括号生成字符串

sql = ('SELECT count() FROM table '       'WHERE id = '10' '       'GROUP BY sex')

print sql

SELECT count() FROM table WHERE id = '10' GROUP BY sex

5,将print的字符串写到文件

>>> print >> open('somefile.txt', 'w+'), 'Hello World'  
# Hello World将写入文件somefile.txt

string模块

image
ascii_letters获取所有ascii码中字母字符的字符串(包含大写和小写)

ascii_uppercase获取所有ascii码中的大写英文字母

ascii_lowercase获取所有ascii码中的小写英文字母

digits获取所有的10进制数字字符

octdigits获取所有的8进制数字字符

hexdigits获取所有16进制的数字字符

printable获取所有可以打印的字符

whitespace获取所有空白字符

punctuation获取所有的标点符号

python 如何从指定文件夹中读取csv文件格式

  遍历文件夹,找到csv格式的文件

import os
Path_list = os.listdir(PathName0)
for name in Path_list:
    if name.endswith('.csv'):
        print(name)
(0)

相关推荐

  • C# 基础知识系列- 9 字符串的更多用法(一)

    0. 前言 在前面的文章里简单介绍了一下字符串的相关内容,并没有涉及到更多的相关内容,这一篇将尝试讲解一下在实际开发工作中会遇到的字符串的很多操作. 1. 创建一个字符串 这部分介绍一下如何创建一个字 ...

  • VS2019 v16.10中头文件更新了

    C++ 20向标准库中添加了一个新型的文本格式化基础设施,主要用来替换传统的snprintf之类的函数,随之带来的是:更快的执行速度和更加安全的接口.C++标准库中的实现是基于现有的{fmt}开源库, ...

  • Tcl中的字符串处理

    string bytelength str返回用于存储字符串的字节数,由于UTF-8编码的原因,或许与string length返回的字符长度有所不同string compare ?-nocase? ...

  • Python基础教程(补中秋的文章)

    千千万万之状容兮,不可得而状也 小马 身份运算符 身份运算符用于比较两个对象是否为同一个对象.身份运算符共有两个:is和is not. Python身份运算符的使用语法如下: obj1 is [not ...

  • Python使用pyodbc访问数据库操作方法详解

    本文实例讲述了Python使用pyodbc访问数据库操作方法. 数据库连接 数据库连接网上大致有两种方法,一种是使用pyodbc,另一种是使用win32com.client,测试了很多遍,最终只有py ...

  • RealPython 基础教程:Python 字符串用法详解

    字符串是一个由字符数据组成的序列.字符串处理是编程必备的技能,很少有应用程序不需要操作字符串的. Python 提供了丰富的运算符.函数和类方法来操作字符串. 通过本文,你将了解如何访问字符串以及提取 ...

  • 三种开放式厨房岛台尺寸布局详解及案例参考#空间布局实用技巧#

    在开放式厨房设计中,岛台作为厨房延伸的一部分,不仅可以作为工作备餐区,也能作为与家人互动的休闲区,还起到隔断装饰的作用. 因此岛台在设计时要考虑到布局的合理性,同时也要根据使用者实际身高及生活习惯来设 ...

  • 八字强弱旺衰鉴定法及扶抑调候通关用神详解

    强弱,旺衰均以日干而言.概括来讲,就是得地与不得地.得势与不得势.得气与不得气.旺八字不一定就富贵,弱八字也不一定就贫贱,不旺不弱的八字(中和八字)也不一定就真的是好命.请看八字强弱旺衰的鉴定法及扶抑 ...

  • 高血压怎么灸?高血压艾灸调理方法详解及案例

    高血压是最常见的慢性病,也是心脑血管病最主要的危险因素,主要症状为头晕.目眩.头痛.心悸.失眠.乏力等,脑卒中.心肌梗死.心力衰竭及慢性肾脏病是其主要并发症. 中医认为,高血压是由于机体内部阴阳虚实失 ...

  • 涨停板敢死队的操作方法详解

    任何一种操作方法,都必须具备科学理论的支持."涨停板敢死队"的操作方法,在策略方面,具备如下科学依据: 第一,强势股必然要通过强势的走势体现出来.之所以他们愿意买入当日第一个涨停板 ...

  • 鱼骨图的详解及案例分析,你看过吗?

    鱼骨图是由日本管理大师石川馨先生所发展出来的,故又名石川图.鱼骨图是一种发现问题"根本原因"的方法,它也可以称之为"因果图". 01.鱼骨图定义 问题的特性总是 ...

  • 高血压艾灸调理方法详解及案例

    高血压是最常见的慢性病,也是心脑血管病最主要的危险因素,主要症状为头晕.目眩.头痛.心悸.失眠.乏力等,脑卒中.心肌梗死.心力衰竭及慢性肾脏病是其主要并发症. 中医认为,高血压是由于机体内部阴阳虚实失 ...

  • 有得干货 | 你真的会做集中采购吗?集采知识点详解及案例分析

    集中采购是每个规模房地产企业都在做的工作,集中采购覆盖率反映了一个企业招标采购的管理水平和能力 集中采购无疑是房地产企业非常重视的一项工作,集采覆盖率的多少反映了一个企业招标采购能力的高低 集采不仅仅 ...