正则表达式就是字符串的匹配规则,在多数编程语言里都有相应的支持,python里对应的模块是re

'.'     默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
'^' 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
'$' 匹配字符结尾, 若指定flags MULTILINE ,re.search('foo.$','foo1\nfoo2\n',re.MULTILINE).group() 会匹配到foo1
'*' 匹配*号前的字符0次或多次, re.search('a*','aaaabac') 结果'aaaa'
'+' 匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
'?' 匹配前一个字符1次或0次 ,re.search('b?','alex').group() 匹配b 0次
'{m}' 匹配前一个字符m次 ,re.search('b{3}','alexbbbs').group() 匹配到'bbb'
'{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
'|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
'(...)' 分组匹配, re.search("(abc){2}a(123|45)", "abcabca456c").group() 结果为'abcabca45' '\A' 只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的,相当于re.match('abc',"alexabc") 或^
'\Z' 匹配字符结尾,同$
'\d' 匹配数字0-9
'\D' 匹配非数字
'\w' 匹配[A-Za-z0-9]
'\W' 匹配非[A-Za-z0-9]
's' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t' '(?P<name>...)' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","").groupdict("city") 结果{'province': '', 'city': '', 'birthday': ''}
re的匹配语法有以下几种
  • re.match 从头开始匹配
  • re.search 匹配包含
  • re.findall 把所有匹配到的字符放到以列表中的元素返回
  • re.split 以匹配到的字符当做列表分隔符
  • re.sub 匹配字符并替换
  • re.fullmatch 全部匹配

re.match 从头开始匹配

 import re
#查找字符串中是数字
s = "abc3kd4"
print(re.match("[0-9]",s)) # 这里的从头开始匹配指的是第一个字符是数字,并不是说从第一个字符开始匹配
#输出:None

re.search 匹配包含

re.match与re.search的区别

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

import re
#查找字符串中是数字
s = "abc3kd4"
print(re.search("[0-9]",s)) # 找到数字就返回.返回的是一个对象.如果拿到值呢?
search_re = re.search("[0-9]",s)
if search_re:
print(search_re.group()) # 取值
# 输出:3

re.findall 把所有匹配到的字符放到以列表中的元素返回

import re
#查找字符串中是数字
s = "abc3kd4" print(re.findall("[0-9]",s)) # 找到所有的数字,返回一个列表. #输出:['3', '4']

常用re匹配规则:

 #  . 匹配任意字符,除换行符\n以外

 s = "123ag1c1d1*A\n"
print(re.search(".", s).group()) # 返回了第一个字符
print(re.findall(".", s)) # 返回全部的字符串,但是并没有返回换行符\n
# 如果我想匹配12这2个字符呢??
print(re.search("..",s)) # 条件写2个"."就可以了.以此类推 # ^ 匹配字符的开头,只能匹配开头的字符,不能匹配中间的字符
print(re.search("^1", s).group()) # 返回一个1
print(re.search("^123", s).group()) #返回123
print(re.search("^2", s).group()) # 这样就什么也匹配不到,会报错. # $ 匹配字符结尾. print(re.search("A$", s).group()) # 匹配以A结尾 返回A
print(re.search("cd*A", s).group()) # 匹配 # * 匹配*号前的//字符,0次或多次.匹配不到就是0次 print(re.search("1*", s).group()) # 被匹配的字符必须相连才能返回多次. 返回1
s2= ""
print(re.search("1*", s2).group()) # 匹配多个相连的1 返回111
# + 匹配+号前一个字符,一次或多次 print(re.search("ab+", "bcdcabbbcd").group()) # 相当于匹配a开头后面和b结尾,直到不是b结尾为止. 返回abbb # ? 匹配?号一个字符0次或1次 print(re.search("ab?", "acbcdefsfabc").group()) # 返回首次匹配到的字符,如果匹配到a或者b其中一个字符,就返回.返回a print(re.search("a{2}", "abcdada").group()) # 匹配2个相连的a,如果没有就报错
print(re.search("a{2}", "abcdaada").group()) # 匹配a2次.返回aa # {n,m} 匹配n到m次,比如{1,9} print(re.search("[a-z]{1,3}","dadrefijlwea")) # 匹配a-z中字符1到3次.返回dad
print(re.search("[a-z]{1,3}","da1adrefijlwea")) # 返回da
"""在开头d后面加上一个1.看看返回什么? 返回了一个d.也就是说,只要匹配到满足1至3中任何一个值的字符,就返回,注意是从最大的数量开始匹配
比如,先匹配3个字符,没有的话,再匹配2个.以此类推""" # | 匹配"|"左边或者右边的字符. print(re.search("jack|Jack","jack").group()) # 匹配jack或者Jack
print(re.search("[j|J]ack","Jack").group()) # 效果同上,简写了. #(...) 分组匹配,把匹配到内容分开
print(re.search("[a-z]+[0-9]+", "jack2018").group()) # 这样我们得到的一个是jack2018的字符串,但是并未分开
print(re.search("([a-z]+)([0-9]+)", "jack2018").groups()) # 在2个条件上加上(),取值的方法变成了groups.返回'jack', '2018') # (?P<name>...) 分组匹配.
id = ""
res = re.search("(?P<pro>\d{3})(?P<city>\d{3})(?P<bron_year>\d{4})",id) #定义好格式,把身份证号分开,输出省份城市代码和出生年
print(res.groupdict()) # {'city': '501', 'bron_year': '1972', 'pro': '512'}
 print(re.split("\d+", "jack19nick23shanshan18")) # 按照数字分割字符

 print(re.findall("\d+", "jack19nick23shanshan18"))  # 找到所有的数字

 re.split()
print(re.split("\d+|#|-", "abc12jack-nick#joseph50chen")) # 以数字或#号或-号分割字符.返回所有可以分割的字符串 # 转义.需求如下:有一组字符以|符号作为分界,要取出|两边所有的字符. s = "jack|nick|joseph|lucy"
s = "jack|nick|joseph|lucy"
# print(re.split("|", s)) # 如果我们这样写就出错了.因为|也是一个re的方法,这里就相当与使用了 |方法.但是|两边又没有写条件,所以报错.
print(re.split("\|", s)) # 在分隔符前加一个\即可,\表示转意. #有个特殊的分隔符\,转意的时候,要写多次
s = "c:\\1234\\123.txt"
print(re.split("\\\\" , s)) # 要写4个\才能完成转意. s='9-2*5/3+7/3*99/4*2998+10*568/14' # 去掉所有的特殊字符
# print(re.split("\W", s)) # 可以用\W表示特殊字符
print(re.split(r'[\+\-\*/]',s)) s1 = "jack22nick18chen25lucy"
print(re.sub("\d+","_",s1)) #把所有的数字替换成一个_ print( re.fullmatch("\w+@\w+\.(com|cn|net)","junkec@126.cn").group()) pattern = re.compile("\w+@\w+\.(com|cn|net)") # 定义一个规则.这样下次直接调用就可以.不用每次都写规则,提高程序运行速度.
s = pattern.fullmatch("junike@126.com").group()
print(s)

RE练习:

1.验证手机号码是否符合规范.

2.验证邮箱是否符合规范.

 """
1.验证手机号是否合法 2.验证邮箱是否合法
"""
import re def auth_email(string):
email = (re.fullmatch("\w+@\w+\.(com|cn|net|com.cn|net.cn)",string))
if email == None:
print("邮箱地址不合法!")
else:
print(string + ",是一个合法的邮箱地址!") def auth_mobile(string):
res = re.fullmatch("^((13[0-9])|(15[0-3]|[5-9])|(18[0-9]))\d{8}", string)
if res == None:
print(string + ",不是一个合法的手机号码!")
else:
print(string + ",是一个合法的手机号码!") while True:
msg = """
1.验证邮箱
2.验证手机
"""
print(msg)
choice = input("choice num>>>")
if choice == "":
emal_address = input("email_address:")
auth_email(emal_address)
elif choice == "":
mobile = input("mobile num:")
auth_mobile(mobile)
else:
print("input error.")
continue

Day 4-11 re正则表达式的更多相关文章

  1. Python for Informatics 第11章 正则表达式二(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 11.1 正则表达式的字符匹配 ...

  2. [JS]笔记11之正则表达式

    -->什么是正则表达式-->定义正则-->正则的索引-->元字符-->方括号.量词.其他符号-->RegExp 对象的方法-->String 对象方法 1.定 ...

  3. Python for Informatics 第11章 正则表达式六(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 11.7 调试 Python有一 ...

  4. Python for Informatics 第11章 正则表达式五(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 11.4 转义字符 之前我们在正 ...

  5. Python for Informatics 第11章 正则表达式四(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 11.3 组合查询和抽取 如果我 ...

  6. Python for Informatics 第11章 正则表达式三(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 11.2 用正则表达式抽取数据 ...

  7. Python for Informatics 第11章 正则表达式一(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 目前为止,我们一直在通读文件,查 ...

  8. 11.20 正则表达式 断言(?=exp)

    今天看源代码,研究了一下qz写的这个方法: // 添加逗号分隔,返回为字符串 comma: function(length) { ) length = ; var source = ('' + thi ...

  9. python3基础11(正则表达式及re模块)

    #生成re对象 compile# 之后再期调用 match search 返回匹配到的字符串# findall 返回匹配结果的列表#如果要对匹配的结果进行分组,可加(),并可通过\数字 去应用

  10. 理解C++11正则表达式(2)

    今天有幸(2016/3/19)在上海参加了C++交流会,见到了梦寐已久想见的台湾C++大神老师侯捷,心情十分的激动.侯老师对C++理解的深刻,让人叹为观止.以为他教学的严谨,说话方式娓娓道来,听着非常 ...

随机推荐

  1. linux下安装jdk_mysql_tomcat_redis

    目前搬我以前的笔记,每个人做笔记方式都不一样,看别人的风格,生成自己的风格 1.linux安装软件和redis学习 jdk --- java开发运行环境 Tomcat - WEB程序的服务器 Mysq ...

  2. Android studio中布局文件出现render problem问题

    当做layout时,可能会出现render problem的情况.意思就是无法预览当前布局页面,这种情况是因为API版本太高造成的.只需要修改API为更低版本即可.

  3. ASP.NET API Helper Page 创建并生成相关帮助文档

    创建API项目 修改原工程文件,该行为是为了避免和引入第三方API工程文件冲突 修改发布设置 引入需要生成文档的相关文件,将第三方API依赖的相关文件(XML文件非常重要,是注释显示的关键),复制到文 ...

  4. iptables snat 和dnat说明

    iptables中的snat和dnat是非常有用的,感觉他们二个比较特别,所以单独拿出来说一下. dnat是用来做目的网络地址转换的,就是重写包的目的IP地址.如果一个包被匹配了,那么和它属于同一个流 ...

  5. pgsql SQL复杂查询示例

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code   WITH tmp AS(SELECT sum(sessioncount) as v ...

  6. 小a的子序列 (线性dp)

    思路:设dp[i][j]表示最大数为j,i为第i的位置的萌值.那么推导过程就是两种情况:1.第i位数不放数字,则结果就是dp[i-1][j]; 2.第i位放数字,则结果就是前面的萌值sum+dp[i- ...

  7. 【转】从零开始玩转logback

    概述 LogBack是一个日志框架,它与Log4j可以说是同出一源,都出自Ceki Gülcü之手.(log4j的原型是早前由Ceki Gülcü贡献给Apache基金会的)下载地址:http://l ...

  8. Java性能优化之编程技巧总结

    程序的性能受代码质量的直接影响.在本文中,主要介绍一些代码编写的小技巧和惯例,这些技巧有助于在代码级别上提升系统性能. 1.慎用异常 在Java软件开发中,经常使用 try-catch 进行错误捕获, ...

  9. mybatis源码- 反射模块一(跟着MyBatis学反射):类级别信息的封装

    目录 1 JavaBean 规范 2 Reflector和ReflectorFactory 2.1 Reflector 属性 2.1.1 属性 2.1.2 Invoker 接口 2.2 Reflect ...

  10. 九、xadmin菜单分组管理

    有的时候,我们的菜单很多很杂,想要把菜单进行分组以方便管理,如下 前一篇博文已经详细讲解了如何菜单自定义排序,自定义分组和排序其实写法类似: 要实现上面这个功能,分为以下几步: 1. 我们需要定义一个 ...