一。正则表达式

  在用户登录注册,以及身份验证时,会发现,如果在手机号的窗口输入字母等不是手机号的格式的字符串时,会报错,这种筛选字符串的功能就是由正则表达式提供。

  正则表达式是几乎所有编程语言都会设计的领域。

  它在python所运用的范围有:

  1.爬虫

  2.数据分析

  在普通的应用中还可以判断字符串是否符合规则。如果需要做手机号的识别,不用正则表达式可以用以下办法:

while True:
phone_number = input('please input your phone number : ')
if len(phone_number) == 11 \
and phone_number.isdigit()\
and (phone_number.startswith('') \
or phone_number.startswith('') \
or phone_number.startswith('') \
or phone_number.startswith('') \
or phone_number.startswith('') \
or phone_number.startswith('')):
print('是合法的手机号码')
else:
print('不是合法的手机号码')

  而使用正则表达式则只需要几行代码就可以实现功能:

import re
phone_number = input('please input your phone number : ')
if re.match('^(13|14|15|16|17|18)[0-9]{9}$',phone_number):
print('是合法的手机号码')
else:
print('不是合法的手机号码')

  所以,学会正则表达式会非常方便

  在正则的编写中,可以使用http://tool.chinaz.com/regex/网站.

  1.当你需要匹配特定字符时,直接写该字符即可。

  2.字符组:[字符组]

  在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示字符分为很多类,比如数字、字母、标点等等。假如你现在要求一个位置"只能出现一个数字",那么这个位置上的字符只能是0、1、2...9这10个数之一。如

正则 说明
[0123456789]a-z 匹配0-9的字符
[0-9] 匹配0-9的字符
[a-z] 匹配a-z的字母
[A-Z] 匹配大写a-z的字母
[0-9a-fA-F] 匹配0-9,a-z,A-Z的字母
   

  上面的匹配都是针对单个字符所出现的情况进行匹配

元字符

匹配内容
匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线
\s 匹配任意的空白符
\d 匹配数字
\n 匹配一个换行符
\t 匹配一个制表符
\b 匹配一个单词的结尾
^ 匹配字符串的开始
$ 匹配字符串的结尾
\W
匹配非字母或数字或下划线
\D
匹配非数字
\S
匹配非空白符
a|b
匹配字符a或字符b
()
匹配括号内的表达式,也表示一个组
[...]
匹配字符组中的字符
[^...]
匹配除了字符组中字符的所有字符

  其中,“.”匹配的是除了换行符意外的所有字符。

  “\w”,word的意思,匹配字母或数字,或下划线。

  “\s”,space的意思,匹配任意的空白符,包括tab,识别成一个空白

  “\d",digit数字,匹配任意的数字。

  ”\W“,匹配非字母或数字或下划线

  “\D”,匹配非数字

  “\S”,匹配非空白符

  这些互补可以匹配任意字符。

  ”\n“,匹配一个换行符

  “\t”,匹配一个tab

  "\b",匹配一个单词的结尾,如ad\b,将匹配所有以ad结尾的单词。

  ”^“,匹配字符串的开始,类似于”startwith“

  ”$“,匹配字符串的结尾,类似与”endswith“

  这两个匹配的是整个字符串的开头和结尾,当两者一起使用时,中间是什么就只能是什么,不能多其他字符

  ”a|b“,匹配字符a,或者字符b,是单独匹配,在匹配时,当第一个字符匹配完后就不会去匹配第二个字符,所以可以将长的字符写在前面

  "[]",匹配[]中的所有字符,是单个匹配。

  [^].,在括号中使用^可以匹配除了该字符以外的其他字符。

量词

  

量词
用法说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

  在字符组后面加上量词就可以匹配多个字符。

  在正则表达式中,匹配都是贪婪配,也就是越多越好。

  量词和量词不能结合在一起,而且量词只能限制紧挨着它的正则表达式。

https://www.cnblogs.com/Dominic-Ji/articles/11109067.html#_label10

  {n}n中是指定个数的量词。

  在量词后面加上?符号可以将贪婪匹配规则改成惰性匹配规则。

分组

  当多个正则符号需要重复多次的时候,或者一个整体需要其他操作时,加上()进行操作

转义符\

  在正则表达式中,有很多有特殊意义的是元字符,比如\n和\s等,如果要在正则中匹配正常的"\n"而不是"换行符"就需要对"\"进行转义,变成'\\'。

  在python中,无论是正则表达式,还是待匹配的内容,都是以字符串的形式出现的,在字符串中\也有特殊的含义,本身还需要转义。所以如果匹配一次"\n",字符串中要写成'\\n',那么正则里就要写成"\\\\n",这样就太麻烦了。这个时候我们就用到了r'\n'这个概念,此时的正则是r'\\n'就可以了

  在正则中\n相当于换行符,\\n相当于\n,经过转义的,python中字符串需要对\进行转义,所以要匹配\n需要写成‘\\\\n’,或者r'\\n’

.*?

  .*?这个的意义是匹配单个字符,通常与另外一个字符联用,如.*?x,匹配字符直到x的出现。

  <.*>贪婪匹配,从后遍历>符号,找到后截取之间的字符

  <.*?>非贪婪匹配,从前遍历>符号,找到后截取之间的字符。

二。re模块

  在re模块中,有三个方法处理正则表达式:

  1。findll

res=re.findall('[a-z]+','aabbc222cskadjl1231231')
print(res)
#输出结果>>>['aabbc', 'cskadjl']

  这个函数的语法是findll(”正则表达式“,”待匹配的字符串“),最后是以列表+字符串的形式输出结果

  注意,在字符串中,会以空格为分隔,匹配到空格时会重新换一个字符串存储。

  2.search

res=re.search('','66,33,66,77,44,66,99')
print(res)
print(res.group())
#输出结果>>><_sre.SRE_Match object; span=(0, 2), match='66'>
#

  在search中,查找字符串后,返回的是一个对象,并不会直接返回值,当需要里面的值时调用.group()方法取值,而且,search只会对其取一次值。

  当没有取值时,会返回一个none,这个时候在使用.group()方法时,会报错,所以,使用search时,通常使用以下方法:

res=re.search('','66,33,66,77,44,66,99')
print(res)
if res:
print(res.group())

  3.match

res=re.match('','66 33 66 77 44 66 99')
print(res)
if res:
print(res.group())
#输出结果>>><_sre.SRE_Match object; span=(0, 1), match='6'>
#

  与search相同,match也是返回的对象,当需要其中的值时使用group方法对其取值,如果找不到i返回none但与search不同的是,match匹配的是字符串的开头部分,如果不是,直接返回none。

其他方法

ret = re.split('[ab]', 'abcd')  # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
print(ret) # ['', '', 'cd'] ret = re.sub('\d', 'H', 'eva3egon4yuan4', 1)#将数字替换成'H',参数1表示只替换1个
print(ret) #evaHegon4yuan4 ret = re.subn('\d', 'H', 'eva3egon4yuan4')#将数字替换成'H',返回元组(替换的结果,替换了多少次)
print(ret) obj = re.compile('\d{3}') #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
print(ret.group()) #结果 : 123

import re
ret = re.finditer('\d', 'ds3sy4784a') #finditer返回一个存放匹配结果的迭代器
print(ret) # <callable_iterator object at 0x10195f940>
print(next(ret).group()) #查看第一个结果
print(next(ret).group()) #查看第二个结果
print([i.group() for i in ret]) #查看剩余的左右结果

注意点:

  1 findall的优先级查询:

import re

ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
print(ret) # ['oldboy'] 这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可 ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
print(ret) # ['www.oldboy.com']

  2.split的优先级查询

ret=re.split("\d+","eva3egon4yuan")
print(ret) #结果 : ['eva', 'egon', 'yuan'] ret=re.split("(\d+)","eva3egon4yuan")
print(ret) #结果 : ['eva', '3', 'egon', '4', 'yuan'] #在匹配部分加上()之后所切出的结果是不同的,
#没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项,
#这个在某些需要保留匹配部分的使用过程是非常重要的。

day15_7.17正则表达式与re模块的更多相关文章

  1. 7.17 正则表达式 re模块

    在介绍正则表达式和re模块之前,先简要介绍一下 正则表达式与re模块的关系 1.正则表达式是一门独立的技术,任何语言均可使用 2.python中要想使用正则表达式需要通过re模块 正则表达式 元字符 ...

  2. 【Python爬虫】正则表达式与re模块

    正则表达式与re模块 阅读目录 在线正则表达式测试 常见匹配模式 re.match re.search re.findall re.compile 实战练习 在线正则表达式测试 http://tool ...

  3. python正则表达式之re模块方法介绍

    python正则表达式之re模块其他方法 1:search(pattern,string,flags=0) 在一个字符串中查找匹配 2:findall(pattern,string,flags=0) ...

  4. Python之正则表达式(re模块)

    本节内容 re模块介绍 使用re模块的步骤 re模块简单应用示例 关于匹配对象的说明 说说正则表达式字符串前的r前缀 re模块综合应用实例 正则表达式(Regluar Expressions)又称规则 ...

  5. 【转】Python之正则表达式(re模块)

    [转]Python之正则表达式(re模块) 本节内容 re模块介绍 使用re模块的步骤 re模块简单应用示例 关于匹配对象的说明 说说正则表达式字符串前的r前缀 re模块综合应用实例 参考文档 提示: ...

  6. 十七. Python基础(17)--正则表达式

    十七. Python基础(17)--正则表达式 1 ● 正则表达式 定义: Regular expressions are sets of symbols that you can use to cr ...

  7. Python与正则表达式[0] -> re 模块的正则表达式匹配

    正则表达式 / Regular Expression 目录 正则表达式模式 re 模块简介 使用正则表达式进行匹配 正则表达式RE(Regular Expression, Regexp, Regex) ...

  8. python 正则表达式re使用模块(match()、search()和compile())

    摘录 python核心编程 python的re模块允许多线程共享一个已编译的正则表达式对象,也支持命名子组.下表是常见的正则表达式属性: 函数/方法 描述 仅仅是re模块函数 compile(patt ...

  9. 正则表达式之re模块

    re模块一.什么是正则表达式与re模块?1.1 字符组1.2 元字符1.2.1 单个使用1.2.2 组合使用二.为什么要使用正则三.如何使用3.1 re模块的三种比较重要的方法3.1.1 findal ...

随机推荐

  1. (day51)三、ORM、路由层、版本差异、流程图

    目录 一.ORM关系建立 (一)ForeignKey(一对多) (二)ManyToManyField(多对多) (三)OneToOneField(一对一) 二.django请求生命周期流程图 三.ur ...

  2. Tomca原理分析之责任链

    责任链使用位置:Container处理请求 Container处理请求是使用Pipeline-Valve管道来处理的!(Valve是阀门之意) Pipeline-Valve是责任链模式,责任链模式是指 ...

  3. Wamp 下运行 CGI 笔记

    虽然假期的余额不足了,但是仔细想想放假又有多少事情可以做呢?休息的差不多了,还是上班的好,长时间的休息人就废了.同意的举手,不同意的就算了. httpd.conf 的配置 我这里使用的是 Wamp 的 ...

  4. WPF-数据模板

    WPF设计数据模板(DataTemplete)是为了让数据也有外衣. DataTemplete常应用在三个地方: 1.ContentControl(内容控件)的ContentTemplete属性,应用 ...

  5. Python - Socket网络编程 - 第二十六天

    网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法. 高 ...

  6. Python - 元组 - 第九天

    Python 元组 Python 的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可.例如: >&g ...

  7. SQL和T-SQL之间的区别

    对于SQL,在我的上一篇博客中<何谓SQL Server数据库?与Access数据库 有什么区别>里面,已经着重说明了SQL作为访问和处理数据库的标准的计算机语言,所以这里就不做过多强调. ...

  8. LiveBOS Webservice传参类型为list数组

    昨天有使用soap传输数据到Webservice,其中字符串类型的都已经传输成功,但是有几个参数传输失败,java服务器端收到的空值. 因为我是php的,然后接收端是java制作的,其中有几个参数是l ...

  9. 工作笔记--adb命令篇

    1.抓log方法 (bat文件) mkdir D:\logcatset /p miaoshu=请描述操作:adb logcat -v threadtime > D:\logcat\%miaosh ...

  10. 智能家居-3.基于esp8266的语音控制系统(软件篇)

    智能家居-1.基于esp8266的语音控制系统(开篇) 智能家居-2.基于esp8266的语音控制系统(硬件篇) 智能家居-3.基于esp8266的语音控制系统(软件篇) 赞赏支持 QQ:505645 ...