9.4-字符串join和分割

生活,不会因为你的节俭而富裕,却会因为你的漂亮更精彩。人生短暂,怎么美怎么活!


别因为困难,就选择放弃。要想学有所成、劳有所获,就必须努力地坚持。坚持的过程可能很苦很累,选择放弃却轻而易举。可是你要知道,一旦选择放弃,你想实现的目标,你想抵达的远方,都只能化作一团泡影。持之以恒的奋斗,才是实现梦想的必由之路。

字符串处理最重要的库是正则表达式库(re),必须掌握
python链式编程思想:"abc".upper().lower().split().append()

字符串:是有序(索引)字符组成的序列(可迭代);

1.Python3 字符串都是Unicode 类型;(UTF-8)

Python2的字符串有两种:str和Unicode;
Python3的字符串也有两种:str和Bytes;
Python2的str相当于Python3的Bytes,而Unicode相当于Python3的Bytes。

Python2里面的str和Unicode是可以混用的,在都是英文字母的时候str和unicode没有区别。
Python3里面的str是在内存中对文本数据进行使用的,Bytes是对二进制数据使用的。

str可以encode为Bytes,但是Bytes不一定可以decode为str。实际上Bytes.decode(‘latin1’)可以称为str,也就是说decode使用的编码决定了decode()的成败,同样的,UTF-8编码的Bytes字符串用GBK去decode()也会出错。

Bytes一般来自网络读取的数据、从二进制文件(图片等)读取的数据、以二进制模式读取的文本文件(.txt, .html, .py, .cpp等)。

2.字符串初始化
1.字符串为不可变对象,不支持赋值;
sql = 'select'
sql[4] = 'o'
----------------------------------------
TypeError: 'str' object does not support item assignment

2.字符串初始化 ——单字符与整体
sql = 'select'
l = list(sql)      # 一个个字符拆开迭代;
print(l)
-------------------------------------------
['s', 'e', 'l', 'e', 'c', 't']

ll = [sql]
print(ll)
------------------------------------------
['select']

总结:
1、python中一切皆对象,字符对象分为两种,一种是unicode对象,一种是str对象。
2、python中字符是unicode为基础的,所以平时我们的字符串,也就是str在python内存中其实是以unicode编码存储的。
3、所以我们平时print一个字符串的时候,看到的是中文,但是如果你把这个字符串放在list里(就是外面加上[ ]),再print,就能看到原生的编码了。因为前面说了,在python内存存储中都是以unicode存储的,所以放在List里面,打印就能看见原生的存储模式。
4、str是字符串对象,但是可以有很多不同的编码,utf-8,gbk,ascii,都是编码。
5、不同编码的str对象,互相不能直接转换,也就是说utf-8编码的不能直接转换成gbk的。
6、但是不同编码的str对象都可以解码成unicode对象,因为一切数据在Python都是以unicode存储的,str.decode(编码类型)
7、unicode对象也可以编码成任意一种编码的str对象。   unicode.encode('编码类型')
8、所以不同编码的str对象可以先解码(decode)成unicode 再编码(encode)成其他编码的str对象。
9、utf-8包含国际上所有字符的编码,GBK主要包含全部中文字符,所以说我们大家爱用utf-8,因为全。
10、所以说utf-8中有一些字符,gbk没有,所以有一些Utf-8解码后再编码成gbk后会报错,因为gbk没有那种字符。
11、有一些str中可能混着有gbk,utf-8等好几种编码,所以有时候decode的时候会报错,因为你按照gbk解码,可能里面又包含了一种不识别的utf-8码得到。
12、以上两条,有没有只编码或者解码对的啊,错误的字符就跳过?
13、有,decode('utf-8','ignore'),encode('utf-8','ignore')      加一个'ignore'参数  就会忽略错误。
14、在python中可以使用chardet.detect(str)来检测一个str是什么编码的:
15、print str 或者 unicode 都会显示出正常的文字,但是python中直接显示 str是'\xe3\xbd'这种字符,unicode是 u'\u4f60' 这种的;
字符串方法
3. 字符串连接 + / *( lst 加法乘法)

2字符串相加,生成一个新的字符串;

# 1. str相加
str_1 = 'Hello world! ' 
str_2 = 'My name is Python猫.'
print(str_1 + str_2)
>>>Hello world! My name is Python猫.
print(str_1)
>>>Hello world! 

(两个难点)

  1. 新入门编程的同学容易犯错,他们不知道字符串是不可变类型,新的字符串会独占一块新的内存,而原来的字符串保持不变。上例中,拼接前有两段字符串,拼接后实际有三段字符串。

  2. 其次,一些有经验的老程序员也容易犯错,他们以为当拼接次数不超过3时,使用+号连接符就会比其它方式快(ps:不少Python教程都是如此建议),但这没有任何合理根据。

事实上,在拼接短的字面值时,由于CPython中的 常数折叠 (constant folding)功能,这些字面值会被转换成更短的形式,例如'a'+'b'+'c' 被转换成'abc','hello'+'world'也会被转换成'hello world'。这种转换是在编译期完成的,而到了运行期时就不会再发生任何拼接操作,因此会加快整体计算的速度。

常数折叠优化有一个限度,它要求拼接结果的长度不超过20。所以,当拼接的最终字符串长度不超过20时,+号操作符的方式,会比后面提到的join等方式快得多,这与+号的使用次数无关。

4. 字符串连接 join()方法 (list没有join方法)

join对象为 str,返回list;

str_list = ['Hello', 'world']
str_join1 = ' '.join(str_list)
str_join2 = '-'.join(str_list)
print(str_join1) >>>Hello world
print(str_join2) >>>Hello-world

print("\n".join(lst))    # 字符换行;
lst=['1',['a','b','c'],'3']
print("\n".join(lst))    #lst不能打印,join对象必须为字符串;

map()高阶函数
# map(str,lst)    #lst元素全部转换为字符s't'r类型;11转换

内建数据类型可以用str来转;
str对象自带的join()方法,接受一个序列参数,可以实现拼接。拼接时,元素若不是字符串,需要先转换一下。可以看出,这种方法比较适用于连接序列对象中(例如列表)的元素,并设置统一的间隔符。

当拼接长度超过20时,这种方式基本上是首选。不过,它的缺点就是,不适合进行零散片段的、不处于序列集合的元素拼接。
5.字符串分割 split 与 partition

split系:(一刀多断)
将字符串按照分隔符分割成若干字符串,并返回列表list
partition系:(一刀三断)
将字符串按照分隔符分割成2段,返回这2段和分割符的元组

5.1 split(sep=None, maxsplit=-1) ->list[] (一刀两断,切多刀)

1.从左到右边;
2.sep 制定分割字符串,缺省的情况下空白字符串作为分割符;(空白与空格的区别)
3.maxsplit 制定分割的次数,-1表示遍历整个字符串;

字符串分割split() 默认把空格整体当作一个分隔符来处理

>>> b'1 2 3'.split()
[b'1', b'2', b'3']
>>> b'1 2 3'.split(maxsplit=1)
[b'1', b'2 3']
>>> b'   1   2   3   '.split()
[b'1', b'2', b'3']

(','.join('abc').split(','))        ['a', 'b', 'c']   #各种方法灵活运用;
"---".join(','.join('abc').split(','))    'a---b---c'   #

1. 字符串分割split() 默认把空白字符整体当作一个分隔符来处理,返回列表;
2. 指定字符,见到字符就分割;
5.2 split、rsplit、splitiness

split()从左向右寻找,以某个元素为中心将左右分割成两个元素并放入列表中
rsplit()从右向左寻找,以某个元素为中心将左右分割成两个元素并放入列表中 #右边right
splitlines()根据换行符(\n)分割并将元素放入列表中,True/False保留分隔符;

'a,b,c,d'.rsplit(',',1)[0]
'ab c\n\nde fg\rkl\r\n123'.splitlines()   #\r算一个;\n\n算两个  \r\n算一个;
--------------------------------------------
'a,b,c'
['ab c', '', 'de fg', 'kl', '123']

总结:
1.split与re.split 不是同一个东西;
5.3 partition()方法 与 rpartition ->() (切一刀,三段)


有下刀的地方(给定分割符),切成2段,并保留分割符号;
关键点:partition() 指定分隔符,切一刀,是为了保留分隔符,返回 元组;

partition() 指定分隔符,切一刀,保留分隔符,返回 元组;
"a,b,c,d".partition(',')
"a,b,c,d".partition('c')
"a,b,c,d".partition(',c,')
"a,b,c,d".rpartition(',')
---------------------------------------------------------
('a', ',', 'b,c,d')
('a,b,', 'c', ',d')
('a,b', ',c,', 'd')
('a,b,c', ',', 'd')
6.字符串大小写
python链式编程思想:"abc".upper().lower().split().append()
append() ->None
split() ->[]
upper() ->str   # 返回s中所有字母字符转换为大写的副本
swapcase() ->str   #返回一个s中大写字母字符转换为小写,小写字母转化为大写的副本:

title()  #返回s的一个副本,其中每个单词的第一个字母转换为大写,其余字母为小写
capitalize()    #返回一个s的副本,第一个字符转换为大写,所有其他字符转换为小写
center()    #居中宽度,填充字符
zfill()      #打印宽度,居右;左边用0填充;
ljust()    #左对齐;
rjust()    #右对齐;
7. 字符串修改; replace(old,new[,count]) ->str
不可变类型字符串可以修改吗?
不管这个数据可不可以修改,尽量的查询,读取,少修改;
f='www.magedu.com'
f.replace('w','p')
f.replace('w','p',2)
strip 、lstrip 、rstrip(三个内建函数)
lstrip  去除字符串左边的空格;
rstrip  去除字符串右边的空格;
strip   去除字符串左右两边的空格,即把lstrip和rstrip都执行一遍;
' a b b c \td\re\n123\n\n'.strip()         |   'a b b c \td\re\n123'
8.字符串查找find / rfind / index / rindex /count

find(sub[.start,end]) ->int
rfind(sub[, start[, end]]) ->int
count(sub[.start,end]) ->int
index(sub[, start[, end]]) ->indexerror
rindex(sub[, start[, end]]) ->indexerror

string6 = '我是一名Python用户,Python给我的工作带来了很多便捷。'
print(string6.index('Python')) | 4
print(string6.find('Python'))  |4

index()与find()的比较:
1.index返回没找到会报错indexerror , 异常值处理毕竟有值比较好用(-1);推荐用index方法;
2.时间复杂度:index和count方法都是O(n);随着列表数据规模的增大,效率下降;
9.字符串判断endswith startswith

endswith(suffix[,satrt[,end]]) ->bool
startswith(suffix[,satrt[,end]]) ->bool


字符串判断is系列
 list(enumerate(s))   # enumerate函数
 [(0, ' '),
 (1, 'I'),
 (2, ' '),
 (3, 'a'),
 (4, 'm'),
 (5, ' '),
 (6, 'v'),
 (7, 'e'),
 (8, 'r'),
 (9, 'y'),
 (10, ' '),
 (11, ' ')]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351