学习文章传送门

正则表达式是用来匹配字符串的。只要符合规则的字符串。就可以认为匹配了。否则,这个字符串不合法。

\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-正则表达式的更多相关文章

  1. Python3学习笔记(urllib模块的使用)转http://www.cnblogs.com/Lands-ljk/p/5447127.html

    Python3学习笔记(urllib模块的使用)   1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None,  ...

  2. Python3学习笔记 - 准备环境

    前言 最近乘着项目不忙想赶一波时髦学习一下Python3.由于正好学习了Docker,并深深迷上了Docker,所以必须趁热打铁的用它来创建我们的Python3的开发测试环境.Python3的中文教程 ...

  3. python3学习笔记(7)_listComprehensions-列表生成式

    #python3 学习笔记17/07/11 # !/usr/bin/env python3 # -*- conding:utf-8 -*- #通过列表生成式可以生成格式各样的list,这种list 一 ...

  4. python3学习笔记(6)_iteration

    #python3 学习笔记17/07/10 # !/usr/bin/env python3 # -*- coding:utf-8 -*- #类似 其他语言的for循环,但是比for抽象程度更高 # f ...

  5. python3学习笔记(5)_slice

    #python3 学习笔记17/07/10 # !/usr/bin/env python3 # -*- coding:utf-8 -*- #切片slice 大大简化 对于指定索引的操作 fruits ...

  6. Python3学习笔记01-环境安装和运行环境

    最近在学习Python3,想写一些自己的学习笔记.方便自己以后看,主要学习的资料来自菜鸟教程的Python3教程和廖雪峰官方网站的Python教程. 1.下载 1)打开https://www.pyth ...

  7. python3学习笔记(9)_closure

    #python 学习笔记 2017/07/13 # !/usr/bin/env python3 # -*- conding:utf-8 -*- #从高阶函数的定义,我们可以知道,把函数作为参数的函数, ...

  8. python3学习笔记(8)_sorted

    # python学习笔记 2017/07/13 # !/usr/bin/env python3 # -*- coding:utf-8 -*- #python 内置sorted()函数 可以对list进 ...

  9. python3学习笔记(4)_function-参数

    #python学习笔记 17/07/10 # !/usr/bin/evn python3 # -*- coding:utf-8 -*- import math #函数 函数的 定义 #定义一个求绝对值 ...

  10. python3学习笔记(1)_string

    #python学习笔记 17/07/07 # !/usr/bin/evn python3 # -*- coding:utf-8 -*- #r"" 引号当中的字符串不转义 #练习 # ...

随机推荐

  1. Hbase balancer RSgroup shell 脚本

    #!/bin/bashTMP_FILE=tmp_groupsGROUPS_FILE=groups.txtecho "list_groups" | hbase shell > ...

  2. source命令导入大数据速度慢优化

    XX市邮政微商城的项目数据库,300多M,约220万条数据,source命令导入花了20个小时左右,太不可思议. 速度慢原因:220多万条数据,就 insert into 了220多万次,下图: 这是 ...

  3. Java方向如何准备技术面试答案(汇总版)

    本文转载自:"Java团长"公众号 1.面向对象和面向过程的区别 面向过程优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机.嵌入式开发.Linu ...

  4. 委托(Delegate)简介

    1.什么是委托?是用来干什么的? 委托是一个类,它定义了方法的类型,使得可以将定义的方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Swit ...

  5. 基于WebSocket 私聊、ws_session、httpsession

    [解码器跟编码器]为了可以直接sendObject 解码 => 解成计算机需要的码 => 将用户输入的文本或者二进制 序列化成消息对象.    (dll 给机器吃的) 编码 => 编 ...

  6. spring data jpa 关键字 命名

    http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#repository-query-keywords

  7. JVM学习(一)简介

    一.java程序编译到运行大概流程 1.Source Code Files为.java文件 2.通过编译产生可执行的字节码. 3.通过jvm得到机器可以执行的机器码 4.操作系统运行机器码,并与硬件进 ...

  8. pyqt5-QWidget坐标系统和大小

    获取坐标和尺寸: 坐标的获取视频教程:https://v.qq.com/x/page/t085892mzh9.html  x()    y()   返回控件的坐标 相对于父控件的坐标(窗口框架左上角) ...

  9. matplotlib-形状

    需要   import matplotlib.patches as mp import numpy as np import matplotlib.pyplot as plt import matpl ...

  10. luogu P4389 付公主的背包

    传送门 神仙题鸭!orz dkw 暴力就是完全背包 而完全背包可以和生成函数扯上关系,记第i种物品质量为\(a_i\),那么这种物品的生成函数\(G(i)=\sum_{j=0}^{\infty}x^{ ...