[要点抢先看]
1. 字符串的查找与替换
2. 字符串的提取, 连接与空白去除
3. 字符串的格式化输出与类型转换
4. 转义字符与原始字符串
[妹子说] 前面一集是初步接触了字符串, 这一集可得多讲讲字符串的进阶用法呀.
没问题, 首先我们说说 python 文本处理的头号工具: 字符串的查找与替换. 就类似于你在 word 里常用的 ctrl+f 那个功能.
字符串的 find 方法实现子字符串查找的操作, 如果包含待查找的子字符串, find 方法就返回他的偏移值, 如果没有找到, 就返回 - 1
- s = 'abcdef'
- print(s.find('cde'))
- print(s.find('xy'))
- 2
- -1
替换操作运用的是 replace 方法, 参数是原始子字符串和用于替换的子字符串, 之后进行全局搜索并替换.
- s = 'abcdef'
- print(s.replace('bcd','XXX'))
- aXXXef
第三个参数表示替换的次数, 如果不设置就表示全部替换, 否则就表示替换前几个
再一个就是字符串的提取功能, 用 split 方法. 利用字符串中存在的分隔符, 将其拆分成子字符串, 并返回其所组成的列表, 这个在文本获取及解析的过程中是非常有用的.
- s = 'Tom,21,USA,UCLA'
- l = s.split(',')
- print(l)
- ['Tom', '21', 'USA', 'UCLA']
如果这些字符是空格隔开的, 方法也是一模一样的
- s = 'Tom 21 USA UCLA'
- l = s.split(' ')
- print(l)
- ['Tom', '21', 'USA', 'UCLA']
那反过来, 如果要将列表中的元素连接成一个字符串呢, 那也有对应的方法, 即 join 方法. 他使用指定的分隔符将列表中的元素连接成一个字符串, 并用指定的分隔符对其进行分割.
这里的分隔符可以是一个空字符, 相当于直接连接
- L = ['s', 'p', 'a', 'm', 'm', 'y']
- s = ''.join(L)
- print(s)
- spammy
也可以实际指定一个分隔符, 如 "-"
- L = ['s', 'p', 'a', 'm', 'm', 'y']
- s = '-'.join(L)
- print(s)
- s-p-a-m-m-y
如果字符串的两侧有空格, 回车换行等, 则可以用 strip 方法将这些 "非内容" 部分都去掉, 使之变成一个 "干货"
- s = 'Tom 21 USA UCLA\n\n'
- print(s)
- print(s.strip())
- Tom 21 USA UCLA
- Tom 21 USA UCLA
从结果看, 字符串左侧的空格和右侧的换行, 都被去掉了.
我们再来谈谈字符串的格式化输出.
python 中字符串的格式化输出我觉得非常好用, 因为我们并不是总能一开始就能获得一个信息完备的字符串常量, 很多关键信息是在运行时从其他地方获取并需要动态赋值的.
比如就说我吧, 名字是酱油哥, 28 岁老叔叔, 本硕毕业于 HUST 和 THU. 如果这里面的关键个人信息都是在运行的过程中赋值的, 那该怎么用呢? 看看这个例子:
- name = '酱油哥'
- age = 28
- school = ['HUST','THU']
- s = 'name:{},age:{},and graduates from{}'.format(name,age,school)
- print(s)
name: 酱油哥, age:28,and graduates from['HUST', 'THU']
这里我们不难发现, 每一个花括号就是一个占位符, 后面的变量依次进行对应, 最关键的是, 这三个变量分别是不同的对象类型, 甚至还有一个列表对象, 但是在字符串格式化时不需要我们对此进行任何的区分, 处理.
至于说占位符和格式化方法中各参数的对应关系, 上面使用的是默认的情况, 即: 按顺序, 一一对应.
当然, 也可以显式的指明各个占位符的顺序
- template = '{1},{0} and {2}'
- s = template.format('spam', 'ham', 'eggs')
- print(s)
- ham,spam and eggs
也可以按照键的顺序进行对应排列, 这一种感觉用的更常见一些
- template = '{key1},{key2} and {key3}'
- s = template.format(key1 = 'spam', key2 = 'ham', key3 = 'eggs')
- print(s)
- spam,ham and eggs
在格式化的方法中, 还包括一些特殊的数字输出的案例, 我们重点说两个, 一个是浮点数指定位数输出, 一个是二进制数输出.
比如, 这个例子, 我们保留两位小数输出浮点数
- template = 'float number = {:.2f}'
- s = template.format(10.4567)
- print(s)
- float number = 10.46
再者, 用二进制输出指定数据
- template = 'number = {:b}'
- s = template.format((2 ** 16) -1)
- print(s)
- number = 1111111111111111
最后, 我们来谈谈字符串中的转义符, 碰到斜杠进行转义, 这是一个常识, 常见的一个例子:
- s = 's\tp\nam'
- print(s)
- s p
- Am
转义字符有很多, 但是我并不是想着重说这个, 因为学过 C 语言的都对此有所了解, 大不了要用的时候再去查嘛.
这里要说一下 python 里的一个反其道而行之的方法, 就是原始字符串:
如果想表达一个文件名的时候, 转义字符反而会引入麻烦, 里面的 \ n 和 \ t 都会被换行符和制表符所替代, 此时我们不需要转义, 倒是想所见即所得, 这就得使用 raw 字符串, 在字符串前加一个 r 就能关闭转义机制.
- s = r'c:\new\test.py'
- print(s)
- c:\new\test.py
[妹子问] 那 python 字符串可以自由的转换数字和字符串么?
这个问题很好, python 的方便之处就体现在许多这样的小细节上, 我们来谈谈字符串, int 类型和浮点类型的转换.
设想这么一个背景, 如果脚本从文件或用户界面得到一个文本字符串形式的数字, 则需要使用转换工具进行预先处理, 否则会报错.
- s = '19'
- i = 3
- print(s+i)
- Traceback (most recent call last):
- File "E:/12homework/12homework.py", line 3, in <module>
- print(s+i)
- TypeError: Can't convert'int' object to str implicitly
正确的做法是:
将字符串转换为 int 型
- s = '19'
- i = 3
- print(int(s) + i)
- 22
将 int 型转换为 str 型
- s = '19'
- i = 3
- print(s + str(i))
- 193
字符串和浮点数转换的方法是
print(float('1.5'), str(4.56))
十进制 int 和二进制直接的转换
- print(bin(12))
- print(int('1110',2))
- 0b1100
- 14
有了这些函数, 我们就能十分方便的实现这些转换功能了.
[妹子说] 感觉头皮略微发麻呀, 说实话不太喜欢类似这一集的知识内容, 感觉知识点很琐碎也很刻板. 不过没办法, 都是应用所必须的, 那就多加练习吧~
来源: https://juejin.im/post/5b3f641af265da0f5e32c6a7