Day 9:Python 字符串和正则介绍总结
好像那里都是字符串?随手敲打键盘,网上copy一个句子,打开浏览器搜索什么。那么字符串的处理就很重要了。下面介绍基本字符串操作和一点儿正则表达。
反转字符串 reversed(s) or s[::-1]
字面意思,把一个字符串按相反的顺序写出:
字符串切片操作[start:end:step]
例子:生成1到15的序列,并在满足条件的索引处,替换为‘java’或者是‘python’
串联字符串 join
常常会使用到用固定的符号来串联一个字符串
分割字符串 split
有的时候我们获得了一个大的字符串,里面包含了各种数据,或者是一组数据,就想把他们分开,使用split方法。
split和join可以看作是在一定程度上的互逆操作。
替换 replace
字符串替换,使用replace方法。
子句判断 find or in
判断一个字符串是否是另一字符串的一部分,内部函数就是两个len,然后走一个for循环就好。
去空格 s.strip()
去空格,去头尾的空格,以达到清洗字符串。使用strip方法,清理字符串开头和结尾的空格和制表符
字符串的字节长度 len()
encode方法对字符串编码后,
最近看了深夜食堂,红尘世间,我裂开了
正则表达式
处理简单的字符串操作,用自带的封装办法即可达到目的,但是稍微复杂那么一点点,使用正则表达式是明智的选择,简洁强大。
re
使用正则表达式第一步,导入re模块
import re
首先,认识常用的元字符:
.
匹配除 "\n" 和 "\r" 之外的任何单个字符。^
匹配字符串开始位置$
匹配字符串中结束的位置*
前面的原子重复 0 次、1 次、多次?
前面的原子重复 0 次或者 1 次+
前面的原子重复 1 次或多次{n}
前面的原子出现了 n 次{n,}
前面的原子至少出现 n 次{n,m}
前面的原子出现次数介于 n-m 之间( )
分组,输出需要的部分
再认识常用的通用字符:
\s
匹配空白字符\w
匹配任意字母/数字/下划线\W
和小写 w 相反,匹配任意字母/数字/下划线以外的字符\d
匹配十进制数字\D
匹配除了十进制数以外的值[0-9]
匹配一个 0~9 之间的数字[a-z]
匹配小写英文字母[A-Z]
匹配大写英文字母
正则表达式,常会涉及到以上这些元字符或通用字符,下面通过 14 个细分的与正则相关的小功能,讨论正则表达式。
search第一个匹配串
即find(),找出第一个匹配项的位置
match与search不同
- match 在原字符串的开始位置匹配
- search 在字符串的任意位置匹配
match想做的事就是在开头就find,最高效,啊抓到你了!
比如,字符串 ourselves,ours 才能 match 到 our
finditer 匹配迭代器
finditer方法,返回所有子串匹配位置的 一个 迭代器。通过返回的对象 re.Match,使用它的方法 span 找出匹配位置。
findall所有匹配
findall 方法能查找出子串的所有匹配。
下面例子,想要找出所有的数字
\d
匹配一位数字 [0-9],+
表示匹配数字前面的一个原子 1 次或多次。
但是有个问题是,日期9.7我显然不想让他们分开,怎恶魔版?修改正则表达式。
匹配浮点数和整数
?
表示前一个字符匹配 0 或 1 次.?
表示匹配小数点(.
)0 次或 1 次
匹配浮点数和整数,第一版正则表达式:r'\d+\.?\d+'
,图形化演示,此正则表达式的分解演示:
1去哪里了?没有匹配全,所以正则表达式还要改。
正则难点之一,需要考虑全面、足够细心,才可能写出准确无误的正则表达式。
匹配不到1的原因是:r'\d+\.?\d+'
,后面的 \d+
表示至少有一位数字,因此,整个表达式至少会匹配两位数。
重新修改正则表达式,将最后的 +
后修改为 *
,表示匹配前面字符 0 次、1 次或多次。
成功!
匹配正整数
题:写出匹配所有正整数的正则表达式。
如果这样写:^\d*$
,会匹配到 0,所以不准确。
如果这样写:^[1-9]*
,会匹配 1.
串中 1
,不是完全匹配,体会 $
的作用。
正确写法:^[1-9]\d*$
,正则分解图:
re.I 忽略大小写(I 大写的i)
re.I 是方法的可选参数,表示忽略大小写。
如下,找出字符串中所有字符 t 或 T 的位置,不区分大小写。
split 分割单词
对于比较复杂的分割:
正则字符串为:[,\s;|]+
,\s
匹配空白字符,正则分解图,如下:
sub 替换匹配串
正则模块,sub 方法,替换匹配到的子串:
compile 预编译
到这个时候上面出现了几次compile,你是否有疑惑过,为什么指派pat的时候有时候用compile而常常不用?
如果要用同一匹配模式,做很多次匹配,可以使用 compile 预先编译串。
栗子:从一系列字符串中,挑选出所有正浮点数。
正则表达式为:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$
,字符 a|b
表示 a
串匹配失败后,才执行 b
串,正则分解图见下:
案例-捕获
正则模块中,根据某个模式串,匹配到结果。
待爬取网页的部分内容如下所示,现在想要提取 <div>
标签中的内容。
content = ''' <h>ddedadsad</h> <div>graph</div> <div>math</div>'''
如果正则匹配串写做 <div>.*</div>
:
如果我们不想保留字符串最开始的 <div>
和结尾的 </div>
,那么,就需要使用一对 ()
去捕获。
正则匹配串修改为:<div>(.*)</div>
,只添加一对括号。
- 看到结果中已经没有开始的
<div>
,结尾的</div>
仅使用一对括号,便成功捕获到我们想要的部分。 (.*)
表示捕获任意多个字符,尽可能多地匹配字符,也被称为贪心捕获
(.*)
的正则分解图如下所示,.
表示匹配除换行符外的任意字符。
看另一种捕获方法:
匹配模式串 (.*?)
,被称为非贪心捕获。正则图中,虚线表示非贪心匹配。