文章目录
一、字符串对象方法
1. split()函数
split()
函数可以将一个字符串分裂成多个字符串组成的列表:
a = 'hello world'
a.split(' ') # 将字符串a以' ' 进行拆分
输出结果:
['hello', 'world']
2. strip()函数
strip()
函数用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列:
a = ' hello world '
a.strip() # 删除字符串a头尾的空格
输出结果:
'hello world'
a = 'abahello worldaaa'
a.strip('a') # 删除字符串a头尾的字符a
输出结果:
'bahello world'
3. join()函数
join() 函数用于将序列(列表、元组等)中的元素以指定的字符连接生成一个新的字符串:
' '.join(['hello', 'world'])
输出结果:
'hello world'
4. 其它函数
二、正则表达式
1. 正则表达式简介
正则表达式提供了一种在文本中灵活查找或匹配字符串(通常是复杂的字符串)模式的方法,目的是为了字符串模式匹配,从而实现搜索和替换功能。
正则表达式的基本组成元素可以分为:字符和元字符。字符很好理解,就是基础的计算机字符编码,通常正则表达式里面使用的就是数字、英文字母。而元字符,也被称为特殊字符,是一些用来表示特殊语义的字符。如^
表示非,|
表示或等。利用这些元字符,才能构造出强大的表达式模式(pattern)。
详见正则表达式不要背
2. 字符
2.1 一对一
最简单的正则表达式可以由简单的数字和字母组成,没有特殊的语义,纯粹就是一一对应的关系。如想在’apple’这个单词里找到‘a’这个字符,就直接用a这个正则就可以了。
但是如果想要匹配特殊字符的话,就要使用元字符\
, 它是转义字符字符,顾名思义,就是让其后续的字符失去其本来的含义。比如要匹配* 这个符号,由于 * 这个符号本身是个特殊字符,所以我要利用转义元字符\
来让它失去其本来的含义,即\*
:
其它特殊字符和对应的正则表达式:
2.2 一对多
用集合区间和通配符可以实现一对多的匹配。
在正则表达式里,集合的定义方式是使用中括号[ ]
。如[123]
这个正则就能同时匹配1,2,3三个字符。
元字符-
就可以用来表示区间范围,利用[0-9]
就能匹配所有的数字, [a-z]
则可以匹配所有的英文小写字母。
同时匹配多个字符的简便正则表达式:
举例:
3. 循环和重复
要实现多个字符的匹配,只要多次循环,重复使用一对一和一对多的正则规则就可以了。根据循环次数的多与少,我们可以分为0次,1次,多次,特定次。
4. 位置边界
在长文本字符串查找过程中,我们常常需要限制查询的位置。
4.1 单词边界
单词是构成句子和文章的基本单位,一个常见的使用场景是把文章或句子中的特定单词找出来。比如找出下面句子中的单词cat:
The cat scattered his food all over the room.
如果直接使用表达式cat
,会同时匹配到cat和scattered这两处文本。这时候我们就需要使用边界正则表达式\b
,它匹配单词的开始或结束,即\bcat\b
:
4.2 字符串边界
在匹配字符串的边界时,元字符^
用来匹配字符串的开头,元字符$
用来匹配字符串的末尾。
5. 修饰符
正则表达式常用的修饰符:
详见正则表达式 - 修饰符
6. 子表达式
从简单到复杂的正则表达式演变通常要采用分组、回溯引用和逻辑处理的思想。利用这三种规则,可以推演出无限复杂的正则表达式。
6.1 分组
分组就是指以(
和)
元字符所包含的正则表达式,每一个分组都是一个子表达式,是构成高级正则表达式的基础。如果只是使用简单的()
匹配语法,本质上和不分组是一样的,如果要发挥它强大的作用,往往要结合回溯引用的方式。
6.2 回溯引用
所谓回溯引用(backreference)指的是模式的后面部分引用前面已经匹配到的子字符串。你可以把它想象成是变量,回溯引用的语法像\1
,\2
,…,其中\1
表示引用第一个子表达式,\2
表示引用第二个子表达式,以此类推。而\0
则表示整个表达式。
比如现在要在下面这个文本里匹配两个连续相同的单词:
Hello what what is the first thing, and I am am scq000.
其中,\b
表示单词的开始,(\w+)
匹配一个单词,\s
则是匹配空白字符,\1
就是引用第一个子表达式,即(\w+)
。
6.3 非捕获正则
如果我们不想子表达式被引用,可以使用非捕获正则,即(?:regex)
,这样就可以避免浪费内存。regex
为正则表达式。
6.4 前向查找
前向查找(lookahead)是用来限制后缀的。凡是以(?=regex)
包含的子表达式,在匹配过程中,都会匹配regex表达式的前面内容,不返回本身。
比如要取到下面的阅读数,就可以用\d+(?=</span>)
来匹配:
<span class=\"read-count\">阅读数:641</span>
6.5 后向查找
语法为(?<=regex)
,匹配regex
表达式的后面的内容,不返回本身。
比如apple和people都包含ple这个后缀,但如果只想找到apple的ple,就可以通过限制ap这个前缀,来唯一确定ple这个单词了。
7. 与 或 非
只有在[
和]
内部使用的^
才表示非的关系。
8. 运算符优先级
正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。
相同优先级的从左到右进行运算,不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序:
9. 常用正则表达式
三、re库
Python内建的re模块是用于将正则表达式应用到字符串上的库。
re模块主要有三个主题:匹配、替代、拆分。
假设我们想将含有多种空白字符(制表符、空格、换行符)的字符串拆分开:
text = 'hello world\t hello\nworld'
re.split('\s+', text)
输出结果:
['hello', 'world', 'hello', 'world']
在调用re.split('\s+', text)
时,正则表达式首先会被编译,然后正则表达式的split
方法在传入文本上被调用。也可以使用re.compile
自行编译,形成一个可复用的正则表达式对象:
text = 'hello world\t hello\nworld'
regex = re.compile('\s+')
regex.split(text)
输出结果:
['hello', 'world', 'hello', 'world']
为了在正则表达式中避免转义符\的影响,可以使用原生字符串语法,比如r'C:\x'
或者用等价的’C:\\x'
findall
方法可用于获得所有匹配正则表达式的模式的列表:
text = 'hello world\t hello\nworld'
regex = re.compile('\s+')
regex.findall(text)
输出结果:
[' ', '\t ', '\n']
findall
返回的是字符串中所有的匹配项,而search
返回的仅仅是第一个匹配项。match
更为严格,它只在字符串的起始位置进行匹配: