前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python入门进阶教程-正则表达式

Python入门进阶教程-正则表达式

作者头像
小一不二三
发布2019-12-31 16:10:38
5160
发布2019-12-31 16:10:38
举报
文章被收录于专栏:小一的学习笔记

作者:一叶

介绍:放不下灵魂的搬砖者

全文共3241字,阅读全文需13分钟

Python版本3.8.0,开发工具:Pycharm

正则表达式(英语:Regular Expression,在代码中常简写为 regex、regexp 或 RE)正则表达式通常被用来检索、替换那些符合某个模式的文本

将Regular Expression(正则表达式)理解成规则表达式更好,一个规则表达式(Regular Expression)通常被称为一个规则(Pattern),即我们需要找到与规则一致的文本。

开篇

正则表达式(Regular Expressions,通常缩写为 Regex)是最强大且不可或缺的文本处理工具 —— 它的用处就是在文本中扫描/搜索与某一规则匹配的所有实例,并且还可以按照规则捕获其中的部分或者全部,对它们进行替换。

01

正则表达式介绍

在规则表达式中,存在操作符和操作元,操作符存在优先级,操作元被称做原子

操作符优先级(由高到低)

(先不用在意操作符的名称,虽然也看不太懂)

代码语言:javascript
复制
 11. 转义符号 (Escaping Symbol):
 2    \
 32. 分组、捕获 (Grouping or Capturing):
 4    (...) (?:...) (?=...) (?!...) (?<=...) (?<!...)
 53. 数量 (Quantifiers)
 6    a* a+ a? a{n, m}
 74. 序列与定位(Sequence and Anchor)
 8    abc ^ $ \b \B
 95. 或(Alternation)
10    a|b|c
116. 原子 (Atoms)
12    a [^abc] \t \r \n \d \D \s \S \w \W .

1. 本义字符

代表的就是它们的字面值,包括从 a 到 z,A 到 Z,0 到 9,还有 _ 注: 非本义字符:\ + * . ? - ^ $ | ( ) [ ] { } < >,建议都直接加上转义符号 \ 来表示

2. 集合原子

标示集合原子,使用方括号 []。 即[abc] 的意思是说,“a or b or c”,即,abc 中的任意一个字符。

在方括号中,我们可以使用两个操作符:-(区间)和 ^(非)

代码语言:javascript
复制
1- [a-z] 表示从小写字母 a 到小写字母 z 中的任意一个字符。
2- [^abc] 表示 abc 以外的其它任意字符,即,非 [abc]。
3
4举:beg[iau]n 能够代表 begin、began,以及 begun。

注:一个集合原子中,^ 符号只能用一次,只能紧跟在 [ 之后。否则不起作用。

3. 类别原子

能够代表 “一类字符” 的原子,它们都得使用转义符号再加上另外一个符号表达

代码语言:javascript
复制
1\d 任意数字;等价于 [0-9]
2\D 任意非数字;等价于 [^0-9]
3\w 任意本义字符;等价于 [a-zA-Z0-9_]
4\W 任意非本义字符;等价于 [^a-zA-Z0-9_]
5\s 任意空白;相当于 [ \f\n\r\t\v](注意,方括号内第一个字符是空格符号)
6\S 任意非空白;相当于 [^ \f\n\r\t\v](注意,紧随 ^ 之后的是一个空格符号)
7.  除 \r \n 之外的任意字符;相当于 [^\r\n]

小技巧: d 是 digits; w 是 word characters; s 是 spaces

代码语言:javascript
复制
 1# 举例
 2import re
 3
 4str = '<dl>(843) 542-4256</dl> <dl>(431) 270-9664</dl>'
 5# 找到字符串中所有"数字-数字"格式的字符,其中第一个数字是三位数,第二个数字是四位数
 6pttn = r'\d\d\d\-\d\d\d\d'
 7print(re.findall(pttn, str))
 8
 9# 输出
10['542-4256', '270-9664']

4. 边界原子

用边界原子指定边界。也可以称作 “定位操作符”。

代码语言:javascript
复制
1^ 匹配被搜索字符串的开始位置;
2$ 匹配被搜索字符串的结束位置;
3\b 匹配单词的边界;er\b,能匹配 coder 中的 er,却不能匹配 error 中的 er;
4\B 匹配非单词边界;er\B,能匹配 error 中的 er,却不能匹配 coder 中的 er。

注:^ 和 $ 在 Python 语言中被 \A 和 \Z 替代。

代码语言:javascript
复制
 1# 举例
 2import re
 3
 4str = 'never ever verb however everest'
 5pttn = r'er\b'
 6print(re.findall(pttn, str))
 7pttn = r'er\B'
 8print(re.findall(pttn, str))
 9
10# 输出
11['er', 'er', 'er']
12['er', 'er']

5. 组合原子

用圆括号 () 将多个单字符原子组合成一个原子, () 内的字符串将被当作一整个原子

代码语言:javascript
复制
1注意:
2er 是两个原子,'e' 和紧随其后的 'r'
3[er] 是一个原子,或者 'e' 或者 'r';
4(er) 是一个原子,'er'

6. 数量操作符

数量操作符有:+ ? * {n, m}。 用来限定位于它们之前的原子允许出现的个数,不加数量限定则代表出现一次且仅出现一次

代码语言:javascript
复制
1+ 代表前面的原子必须至少出现一次,即: 出现次数 ≧ 1
2? 代表前面的原子最多只可以出现一次,即:0 ≦ 出现次数 ≦ 1
3* 代表前面的原子可以不出现,也可以出现一次或者多次,即: 出现次数 ≧ 0
4{n} 代表之前的原子出现确定的 n 次;
5{n,} 代表之前的原子出现至少 n 次;
6{n, m} 代表之前的原子出现至少 n 次,至多 m 次
代码语言:javascript
复制
 1# 匹配字符串
 2str = ['google', 'gooogle', 'goooogle', 'goooooogle']
 3
 4# 遍历字符串
 5for str_per in str:
 6    # o最少出现一次 
 7    pttn = r'go+gle'
 8    print(re.findall(pttn, str_per))
 9
10    # o最多出现一次 
11    pttn = r'go?gle'
12    print(re.findall(pttn, str_per))
13
14    # o出现次数≧ 0
15    pttn = r'go?gle'
16    print(re.findall(pttn, str_per))
17
18    # o出现至少2次,至多5次
19    pttn = r'go{2,5}gle'
20    print(re.findall(pttn, str_per))
21
22    # 进阶:联立组合原子
23    # g 或者 o 最少出现一次
24    pttn = r'[go]+gle'
25
26    # go 最少出现一次
27    pttn = r'(go)+gle'
28    print(re.findall(pttn, str_per))

7. 或操作符 |

或操作符 | 是所有操作符中优先级最低的

代码语言:javascript
复制
1import re
2
3str = 'begin began begun begins beginn'
4pttn = r'begin|began|begun'
5print(re.findall(pttn, str))
6
7# 输出
8['begin', 'began', 'begun', 'begin', 'begin']

注: 方括号的 | 不被当作特殊符号,而是被当作 | 这个符号本身。 在方括号中的圆括号,也被当作圆括号 () 本身,而无分组含义。


02

正则表达式详细使用

Python 语言通过导入re 模块使用正则表达式所有功能。

1. re.match函数

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。

代码语言:javascript
复制
1# 函数语法:
2# pattern:匹配的正则表达式
3# string:要匹配的字符串。
4# flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
5re.match(pattern, string, flags=0)
代码语言:javascript
复制
1# 匹配字符串,re.I表示对大小写不敏感
2print(re.match('Www', 'www.runoob.com', flags=re.I).span())
3
4# 输出
5(0, 3)

2. re.search函数

扫描整个字符串并返回第一个成功的匹配。

代码语言:javascript
复制
1# 函数语法:
2# 参数使用同 match 函数
3re.search(pattern, string, flags=0)
代码语言:javascript
复制
1# 匹配字符串,re.I表示对大小写不敏感
2print(re.search('Www', 'www.runoob.com', flags=re.I).span())
3
4# 输出
5(0, 3)

注:re.match只匹配字符串的开始,而re.search匹配整个字符串,直到找到一个匹配。

3. re.findall函数

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

代码语言:javascript
复制
1# 函数语法:
2# string 待匹配的字符串。
3# pos 可选参数,指定字符串的起始位置,默认为 0。
4# endpos 可选参数,指定字符串的结束位置,默认为字符串的长度。
5re.findall(string[, pos[, endpos]])

注:match 和 search 是匹配一次结果,findall 匹配所有结果。

代码语言:javascript
复制
1import re
 2# 查找数字
 3pattern = re.compile(r'\d+') 
 4# 查找字符串中所有的数字
 5print(pattern.findall('zhiqiu 123 xiaomeng 456'))
 6# 查找字符串中0-10位的所有数字
 7print(pattern.findall('zhiqiu88zhiqiu123xiaomeng456', 0, 10))
 8
 9# 输出
10['123', '456']
11['88']

4. re.split函数

split 方法按照能够匹配的子串将字符串分割后返回列表

代码语言:javascript
复制
1# 函数语法:
2# pattern:匹配的正则表达式
3# string:要匹配的字符串。
4# maxsplit:分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。
5# flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
6re.split(pattern, string[, maxsplit=0, flags=0])
代码语言:javascript
复制
1# 通过数字作为分隔符对字符串进行分割
2print(re.split('\d+', 'zhiqiu88zhiqiu123xiaomeng456'))
3
4# 输出:
5['zhiqiu', 'zhiqiu', 'xiaomeng', '']

补充:正则表达式修饰符

代码语言:javascript
复制
1re.I    使匹配对大小写不敏感
2re.L    做本地化识别(locale-aware)匹配
3re.M    多行匹配,影响 ^ 和 $
4re.S    使 . 匹配包括换行在内的所有字符
5re.U    根据Unicode字符集解析字符。
6re.X    该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

正则表达式是Python中一个超级实用的一个知识点,不论是在爬虫的网页解析还是在数据清洗中,都很实用,且非常高效,建议掌握!

下节将介绍Python 多线程VS多进程

Python系列

Python系列会持续更新,从基础入门到进阶技巧,从编程语法到项目实战。若您在阅读的过程中发现文章存在错误,烦请指正,非常感谢;若您在阅读的过程中能有所收获,欢迎一起分享交流。

如果你也想和我一起学习Python,关注我吧!

学习Python,我们不只是说说而已

End

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 知秋小梦 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 正则表达式介绍
  • 正则表达式详细使用
    • 正则表达式是Python中一个超级实用的一个知识点,不论是在爬虫的网页解析还是在数据清洗中,都很实用,且非常高效,建议掌握!
    • Python系列
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档