正则表达式学习笔记
正则表达式
主要内容
- 正则表达式简介
- 匹配单个字符、多个字符、开头结尾、分组
- re模块
- 应用演练
正则表达式简介
正则表达式(Regular Expression)是一种文本模式。基于正则表达式(文本模式)可以对字符串这类非结构化数据进行模式验证、文本替换以及子字符串提取。
正则表达式可以用于:
-
验证字符串的模式
测试输入字符串是否符合电话号码或信用卡号码模式。称为数据验证。
-
替换文本
-
基于模式匹配从字符串中提取子字符串
字符串为一种非结构化类型,可以通过提取子字符串的方式对字符串数据进行清洗。
正则表达式示例:
上式的正则表达式用以匹配一个或多个数字开头并以abc结尾的字符串,其中:
^[0-9]+
表示匹配一个多个数字开头的字符串abc$
表示匹配以abc结尾的字符串
匹配单个字符、多个字符、开头结尾、分组
- 匹配单个字符
字符 | 功能 |
---|---|
. | 匹配任意一个字符(除了\n) |
\d | 匹配任意数字,等价于[0-9] |
\D | 匹配任意非非数字 |
\s | 匹配任意空白字符等价[\t\n\r\f] |
\S | 匹配任意非空白字符 |
\w | 匹配单词字符,等价[a-zA-Z_]同时也包括任意汉字 |
\W | 匹配非单词字符 |
[...] | 匹配[]中的一个字符 |
[^...] | 匹配不在[]中的字符 |
- 匹配多个字符
字符 | 功能 |
---|---|
* | 匹配前一个字符出现0次或者无限次,即可有可无 |
+ | 匹配前一个字符出现0次或者无限次,即一次或多次 |
? | 匹配前一个字符出现0次或多次,即存在或不存在 |
匹配前一个字符出现m次 | |
匹配前一个字符出现m次到n次 |
python中数量词默认是贪婪,总尝试匹配尽可能多的字符;在"*","+","?"后加上"?"可以要求正则匹配越少越好。
>>>re.match(r"aa(\d+)", "aa123bbbb").group() #方法group用于输出匹配结果 >>>"aa123"
>>>re.match(r"aa(\d+?)", "aa123bbbb").group() #方法group用于输出匹配结果 >>>"aa1"
python中正则表达式前r的作用:
r表示原生字符串,用以解决转义字符""的困扰。假如你需要匹配文本中的字符"",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。
>>> ret = re.match("c:\\\\a","c:\\a").group() #需要4个反斜杠 >>> print(ret) c:\a
>>> ret = re.match(r"c:\\a",mm).group() #只需要2个放斜杠 >>> print(ret) c:\a
- 匹配开头与结尾
字符 | 功能 |
---|---|
^ | 匹配字符串开头(行首) |
$ | 匹配字符串结尾(行尾) |
- 匹配分组
分组后使用方法.group()可以提取相应匹配的字符串。
字符 | 功能 |
---|---|
| | 匹配左右任意一个表达式 |
(ab) | 将括号中字符作为一个分组 |
\num | 引用非组num匹配到的字符串 |
(?p |
分组起别名 |
(?P=name) | 引用别名为name分组匹配到的字符串 |
re模块
re模块使python拥有全部的正则表达式功能,re中的函数有:
-
re.match(pattern, string, flags=0)
- pattern为要匹配的正则表达式
- string为要匹配的字符串
- flags标志位用于控制多行匹配等匹配方式。
re.match()返回一个对象,通过re.match().group()可以返回匹配的字符串。
-
re.search()
- 与re.match()区别:re.match()需要字符串首个字符与正则表达式中的一致,匹配字符串开头,相当于正则表达式开头中省略了"^";而re.search()则不需。
-
re.findall()
- 匹配的所有子串,并返回一个列表
注意: match 和 search 是匹配一次 findall 匹配所有。
-
re.finditer()
- 与findall类似,但返回一个迭代器。
-
re.sub(pattern, repl, string, count=0, flags=0)
- repl:替换的字符串,也可为一个函数。
- count:模式匹配后替换的最大次数,默认0为替换所有的匹配。
-
re.split()
- 将字符串分割后返回列表
-
re.compile(pattern, flags)
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
应用演练
-
验证字符串模式
-
变量明命名是否正确
import re def main(): """ 变量名由字母、下划线或者数字组成并且以字母或下划线开头。 """ names = ["_aabb", "abd123", "abd123!", "1122ccc", "1_cc"] pattern = re.compile(r"[a-zA-Z_][a-zA-Z_0-9]*$") #注意需加$匹配结尾 for name in names: ret = re.match(pattern, name) #re.match返回一个对象,如果未匹配返回none if ret: print("变量名%s正确" % name) else: print("变量名%s不正确" % name) if __name__ == "__main__": main()
-
-
替换文本
-
对re.sub()中传入函数
import re def double(matched): """ 将re.sub()中匹配的字符串数字乘以2并返回。 matched接受一个re.sub()返回的对象。 """ value = int(matched.group('value')) #value为分组的引用 return str(value * 2) def main(): test_str = "adfa125adfa" pattern = re.compile(r"(?P<value>\d+)") print(re.sub(pattern, double, test_str)) if __name__ == "__main__": main()
>>>adfa250adfa
-
对字符串进行清洗
import re def main(): """ 删除test_str中的标签,换行符 """ test_str = """ <div> <p>岗位职责:</p> <p>完成推荐算法、数据统计、接口、后台等服务器端相关工作</p> <p><br></p> <p>必备要求:</p> <p>良好的自我驱动力和职业素养,工作积极主动、结果导向</p> <p> <br></p> <p>技术要求:</p> <p>1、一年以上 Python 开发经验,掌握面向对象分析和设计,了解设计模式</p> <p>2、掌握HTTP协议,熟悉MVC、MVVM等概念以及相关WEB开发框架</p> <p>3、掌握关系数据库开发设计,掌握 SQL,熟练使用 MySQL/PostgreSQL 中的一种<br></p> <p>4、掌握NoSQL、MQ,熟练使用对应技术解决方案</p> <p>5、熟悉 Javascript/CSS/HTML5,JQuery、React、Vue.js</p> <p> <br></p> <p>加分项:</p> <p>大数据,数理统计,机器学习,sklearn,高性能,大并发。</p> </div> """ pattern = re.compile(r"<[^>]*>| |\n") print(re.sub(pattern, "", test_str)) if __name__ == "__main__": main()
岗位职责:完成推荐算法、数据统计、接口、后台等服务器端相关工作必备要求:良好的自我驱动力和职业素养,工作积极主动、结果导向技术要求:1、一年以上 Python 开发经验,掌握面向对象分析和设计,了解设计模式2、掌握HTTP协议,熟悉MVC、MVVM等概念以及相关WEB开发框架3、掌握关系数据库开发设计,掌握 SQL,熟练使用 MySQL/PostgreSQL 中的一种4、掌握NoSQL、MQ,熟练使用对应技术解决方案5、熟悉 Javascript/CSS/HTML5,JQuery、React、Vue.js加分项:大数据,数理统计,机器学习,sklearn,高性能,大并发。
-
-
提取子字符串
-
提取序号和电话号码切割字符串
>>> ret = re.match("([^-]*)-(\d+)", "123-12345678") >>> ret.group(1) #区号 >>> ret.group(2) #电话号码
-