前言
昨天学习了@白月黑羽up主所出的正则表达式视频课程的一部分,计划三天学完,今天是第二天,继续坚持。
学习记录
正则表达式入门依旧是看小甲鱼的文档和白月黑羽up主的视频
贪婪模式和非贪婪模式
题目: 把字符串
'<html><head><title>Title</title>'
中的html元素提取出来,得到这样一个列表[‘<html>’, ‘<head>’, ‘<title>’, ‘</title>’]
很容易想到使用正则表达式 <.*>,然而运行如下
原来正则表达式中*
和+
都是贪婪的,使用它们时,会尽可能多的匹配内容,在这个问题中会一直匹配到字符串中的最后一个字符>
才会收手,为了解决这个问题,就需要使用非贪婪模式,也就是在*
后面加上?
,代码实现
source = '<html><head><title>Title</title>'
import re
# 注意多出的问号
p = re.compile(r'<.*?>')
print(p.findall(source))
重要的反斜杠
先引入一个概念
反斜杠后边紧跟一个元字符,那么元字符的“特殊功能”就不会触发,变为普通字符,而在普通字符前加上反斜杠可以使得普通字符拥有特殊能力(例如
\d
表示匹配任何十进制数字)
上题目
题目:要在下面的文本中搜索所有点前面的字符串,也包含点本身
苹果.是绿色的
橙子.是橙色的
香蕉.是黄色的
下边列举一些反斜杠加字符构成的特殊含义:
特殊字符
|
含义
|
\d
| 匹配任何十进制数字;相当于类 [0-9] |
\D
| 与 \d 相反,匹配任何非十进制数字的字符;相当于类 [^0-9] |
\s
| 匹配任何空白字符(包含空格、换行符、制表符等);相当于类 [ \t\n\r\f\v] |
\S
| 与 \s 相反,匹配任何非空白字符;相当于类 [^ \t\n\r\f\v] |
\w
| 匹配任何单词字符,见上方解释 |
\W
| 于 \w 相反 |
\b
| 匹配单词的开始或结束 |
\B
| 与 \b 相反 |
从上述可以归纳出特殊字符记法,d(digital)、s(space)、w(word)、b(begin)
用大小写来互补,从而形成全集
举个实例
编译标志
编译标志可以修改正则表达式的工作方式。在re模块下,编译标志均有两个名字:完整名和简名
下边列举一些支持的编译标志:
标志 | 含义 |
ASCII, A | 使得转义符号如 \w,\b,\s 和 \d 只能匹配 ASCII 字符 |
DOTALL, S | 使得 . 匹配任何符号,包括换行符 |
IGNORECASE, I | 匹配的时候不区分大小写 |
LOCALE, L | 支持当前的语言(区域)设置 |
MULTILINE, M | 多行匹配,影响 ^ 和 $ |
VERBOSE, X (for 'extended') | 启用详细的正则表达式 |
举个实例
题目:从下列文本中提取英文用户名
王亚辉
tony
刘文武
source = '''
王亚辉
tony
刘文武
'''
import re
p = re.compile(r'\w{2,4}',re.A)
print(p.findall(source))
元字符[]
元字符[]
表示要匹配指定的几个字符中的一个或多个
题目:匹配文本中电话号码以15……或者17……开头的
王亚辉,13500344799,89
徐志摩,1b900785634,23
周根源,15909875678,44
周根源,17909875678,44
都云摩,05900785634,23
李根源,23909875678,44
文本
王亚辉,13500344799,89
徐志摩,1b900785634,23
周根源,15909875678,44
周根源,z7909875678,44
郝云摩,b5900785634,23
李根源,a3909875678,44
一些元字符在方括号内就会变成普通字符
如果在方括号中使用^
,表示非,也就是取补集
小结
今天的学习任务其实还没有完全完成,但要熄灯了,先洗漱,主要花时间解决微信小程序如何自动化操作及安卓手机单个应用控制音量,路一步步走嘛(我要变赵高),感谢小甲鱼整理的文档和白月黑羽up主做的视频教程,对我学习正则表达式帮助很大。