Python3学习笔记33-正则表达式
正则表达式是用来匹配字符串的。只要符合规则的字符串。就可以认为匹配了。否则,这个字符串不合法。
\d:可以匹配一个数字 ‘00\d’可以匹配001不能匹配00A
\w:可以匹配一个字母或数字 ‘00\w’可以匹配00A
.:可以匹配任何字符 ‘py.’可以匹配‘pyc’,‘py!‘,‘py1’
\s:可以匹配一个空格
长度
*:表示任意个字符(包括0个)
+:表示至少一个字符
?:表示0个或一个
{n}:表示n个字符
{n,m}:表示n到m个字符
\d{3}\s+\d{3,8} 从左到右表示 三个数字 一个空格 3到8个数字 也就是可以匹配用空格隔开的带区号的电话号码。比如021-123456这种。
看别的文章说使用‘-’隔开说要使用’\‘转义符,因为‘-’是特殊字符。但是在PyCharm的时候,加了\会有错误提示,不加\不会有提示,不过匹配结果都是对的。
我理解是在表达式中的符号,表达这个符号本身的意思,而不是表达式的匹配方式的时候,才需要加\。比如我想要匹配加号,因为+本身表示一个字符,需要用\+来匹配加号
范围
使用[]可以表示范围,比如:
[0-9a-zA-Z\_] 表示可以匹配一个数字、字母或者下划线
可以将范围和长度一起组合使用
[0-9a-zA-Z\_]+ 表示可以匹配至少由一个数字、字母或者下划线组成的字符串。比如‘010’,‘0_a’,'py_'等等
|表示或 A|B表示可以匹配A或B 比如(P|p)ython可以匹配‘python’或‘Python’
^表示行的开头,^\d就表示必须以数字开头
$表示行的结尾,\w$表示必须以数字结尾
re模块
match()方法判断是否匹配,匹配成功返回Match对象,否则返回None
import re
test = re.match('\d{3}-\d{3,8}','012-1234556')
print(test)
切分字符串
使用正则表达式切分字符串比用固定的字符更灵活。比如连续的空格
test1 = re.split(r'\s+','a b c')
print(test1)
在加上,试试
test1 = re.split(r'[\s,]+','a,b, ,c')
print(test1)
通过正则的切分,可以把不规范的输入转换为正确的。
分组
用()表示分组,可以用来提取正则中的子串
import re
test1 = re.match(r'^(\d{3})-(\d{3,8})$','021-123456')
print(test1)
print(test1.group(0))
print(test1.group(1))
print(test1.group(2))
group(0)是原始字符,group(1)才是第一个子串
groups()可以获得所有切分后的子串
贪婪匹配
正则默认是贪婪匹配,也就是尽可能的匹配更多的字符。比如匹配数字后的0:
test1 = re.match(r'^(\d+)(0*)$','')
print(test1.groups())
由于\d+是贪婪匹配,把后面的0都给匹配完了,所以第二个子串没有匹配到
必须让\d+采用非贪婪匹配,也及时尽可能少的匹配,才能把后面的0匹配出来,加上?就可以让\d+采用非贪婪匹配
test1 = re.match(r'^(\d+?)(0*)$','')
print(test1.groups())
编译
如果一个正则需要使用很多次,出于效率考虑,可以使用compile()预编译这个正则
re_tel = re.compile('^(\d{3})-(\d{3,8})$')
test = re_tel.match('021-1234556')
print(test)
print(test.groups())
练习
尝试写验证邮箱的正则。版本一应该可以验证类似邮箱。someone@gmail.com,bill.gates@microsoft.com
import re
def is_valid_email(addr):
if re.match(r'^\w*\.?\w*@\w*.\w*$',addr):
return True
else:
return False
assert is_valid_email('someone@gmail.com')
assert is_valid_email('bill.gates@microsoft.com')
assert not is_valid_email('bob#example.com')
assert not is_valid_email('mr-bob@example.com')
print('ok')
练习完了自己大致理解。主要有两个地方比较麻烦,一个是.本身在正则表达式是有含义的,表示可以匹配任意一个字符。所以当需要匹配成.符号的时候要加上\转义符。另外就是要在.后面加上?,表示非贪婪匹配,不然就直接匹配到最后的.com那里去的,@就匹配不到了。
版本二可以把邮箱前面的姓名提取出来
<Tom Paris> tom@voyager.org => Tom Paris
bob@example.com => bob
import re
def name_of_email(addr):
test = re.match(r'<?(\w*\s*\w*)>?\s*\w*@\w*\.\w*',addr)
print(test.group(1))
return test.group(1)
assert name_of_email('<Tom Paris> tom@voyager.org') == 'Tom Paris'
assert name_of_email('tom@voyager.org') == 'tom'
print('ok')
Python3学习笔记33-正则表达式的更多相关文章
- Python3学习笔记(urllib模块的使用)转http://www.cnblogs.com/Lands-ljk/p/5447127.html
Python3学习笔记(urllib模块的使用) 1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, ...
- Python3学习笔记 - 准备环境
前言 最近乘着项目不忙想赶一波时髦学习一下Python3.由于正好学习了Docker,并深深迷上了Docker,所以必须趁热打铁的用它来创建我们的Python3的开发测试环境.Python3的中文教程 ...
- python3学习笔记(7)_listComprehensions-列表生成式
#python3 学习笔记17/07/11 # !/usr/bin/env python3 # -*- conding:utf-8 -*- #通过列表生成式可以生成格式各样的list,这种list 一 ...
- python3学习笔记(6)_iteration
#python3 学习笔记17/07/10 # !/usr/bin/env python3 # -*- coding:utf-8 -*- #类似 其他语言的for循环,但是比for抽象程度更高 # f ...
- python3学习笔记(5)_slice
#python3 学习笔记17/07/10 # !/usr/bin/env python3 # -*- coding:utf-8 -*- #切片slice 大大简化 对于指定索引的操作 fruits ...
- Python3学习笔记01-环境安装和运行环境
最近在学习Python3,想写一些自己的学习笔记.方便自己以后看,主要学习的资料来自菜鸟教程的Python3教程和廖雪峰官方网站的Python教程. 1.下载 1)打开https://www.pyth ...
- python3学习笔记(9)_closure
#python 学习笔记 2017/07/13 # !/usr/bin/env python3 # -*- conding:utf-8 -*- #从高阶函数的定义,我们可以知道,把函数作为参数的函数, ...
- python3学习笔记(8)_sorted
# python学习笔记 2017/07/13 # !/usr/bin/env python3 # -*- coding:utf-8 -*- #python 内置sorted()函数 可以对list进 ...
- python3学习笔记(4)_function-参数
#python学习笔记 17/07/10 # !/usr/bin/evn python3 # -*- coding:utf-8 -*- import math #函数 函数的 定义 #定义一个求绝对值 ...
- python3学习笔记(1)_string
#python学习笔记 17/07/07 # !/usr/bin/evn python3 # -*- coding:utf-8 -*- #r"" 引号当中的字符串不转义 #练习 # ...
随机推荐
- java 中数据的强制转换 和计算的补码运算
原码 反码 补码的定义与运算 1原码: 原码是将十进制或者其他进制的数转换为二进制表示(且要根据数据的类型转换) 如:130 (默认是Int类型,则是4个字节) 原码是:00000000 000000 ...
- Python list 初始化技巧
1.一维列表 1.1 递增列表 # 初始化递增的list,与L = [i for i in range(10)] 效果相同 L = range(10) # 版本变化L = i for i in ran ...
- C++ cout格式化输出(转)
C++ cout格式化输出(转) 这篇文章主要讲解如何在C++中使用cout进行高级的格式化输出操作,包括数字的各种计数法(精度)输出,左或右对齐,大小写等等.通过本文,您可以完全脱离scanf/pr ...
- .net面式题
.Net httphandler与httpmodule区别 动态控件在postback能否保存下来(不能) 序列化(对象到其他格式(xml/json/byte...)JavaScriptSeriali ...
- shop++改造之Filter类
基于shop++源码进行商城改造.本来想大展手脚,结果一入手.发觉瞬间淹没了我的才华,sql语句也得贼溜没啥用. 不得不说这个商城源码价值很高,封装的很精屁. 下面是我第一天入手的坑. 数据库建好了表 ...
- HDU 1024(新最大子序列和 DP)
题意是要在一段数列中求 m 段互不重合的子数列的最大和. 动态规划,用数组 num[ ] 存储所给数列,建二维数组 dp[ ][ ] , dp[ i ][ j ] 表示当选择了第 j 个数字( num ...
- HDU 6433(2的n次方 **)
题意是就是求出 2 的 n 次方. 直接求肯定不行,直接将每一位存在一个数组的各个位置即可,这里先解出 2 的 n 次方的位数,再直接模拟每一位乘以 2 即可得到答案. 求解 2 的 n 次方的位数的 ...
- Centos6下安装中文字体
先安装字体管理软件 [root@localhost ~]# yum install fontconfig 将需要安装的字体放到/usr/share/fonts/chinese/目录下 如果不存在这个目 ...
- GeoGlobe Server使用问题收集
本人在做数字县区过程中,需要吉奥GeoGlobe Server发布数据,期间遇到些平台问题.故立此帖,作为参考. 1 字段限制: GeoGlobe 5.2部署在我的服务器Windows Server ...
- Silverlight网页打开后马上崩溃,“白屏”,而且毫无提示
如题,出现白屏的问题 在Application_UnhandledException函数内,跟踪异常e的提示信息,可以了解到如下信息: at System.ComponentModel.AsyncCo ...