python入门(十六):正则
1、正则:对一些字符串实现模糊的匹配
使用场景:
爬虫:例如,网页源码里面的url都提取出来。网页里面提取我们想要的数据
分析日志:例如,拿到所有的ip,看看哪些ip访问过我的网站
2、引入包
>>> import re #re=regular expression 正则表达式
3、匹配最开头
1) 匹配最开头的任意字符串
>>> re.match("abc","abcd") #re.match(模式,目标字符串)
<_sre.SRE_Match object; span=(0, 3), match='abc'>#span(0,3)表示匹配的范围是(0,3),左闭右开; match='abc'表示匹配的内容是’abc’
>>> a=re.match("bc","abcd") #匹配最开头的bc
>>> a #打印a,未返回任何值
>>> type(a) #查看a的类型
<class 'NoneType'> #返回值是nonetype,为空
>>> result=re.match("abc","abcd")
>>> result
<_sre.SRE_Match object; span=(0, 3), match='abc'>
>>> type(result) #匹配到后的类型是_sre.SRE_Match,正则表达式匹配结果的对象(匹配对象)
<class '_sre.SRE_Match'>
>>>re.match("中国","中国abcd") #也可匹配出中文
>>> <_sre.SRE_Match object; span=(0, 2), match='中国'>
2) 匹配最开头的任意数字
>>> re.match("\d","3WSD") #匹配最开头的数字,d=digit,re.match(模式,目标字符串)
<_sre.SRE_Match object; span=(0, 1), match='3'>
>>> re.match("\d","ab1cd") #字符串最开头为非数字时,未匹配出任何内容
>>>
>>> re.match(r"\d","ab1cd") #由于在文件中,”\d可能需要需要写“\\d”,需要转转译一下为了统一,写正则,交互模式与文件中,前面都加个r
4、匹配任意位置,匹配第一个后便结束
1) 匹配任意位置字符串 #re.search(模式,目标字符串)
>>> re.search(r"b1c","ab1cd") #可以匹配出非开头的字符串
<_sre.SRE_Match object; span=(1, 4), match='b1c'>
>>> re.search(r"b1c","ab1cd2323b1cdkjf") #当有多个可匹配的内容时,输出第一个便结束
<_sre.SRE_Match object; span=(1, 4), match='b1c'>
2) 匹配任意位置的数字
>>> re.search(r"\d","a1b1d1") #当有多个可匹配的内容时,输出第一个便结束
<_sre.SRE_Match object; span=(1, 2), match='1'>
>>> re.search(r"\d","a21c3d4") #“\d”是匹配所有的数字,并非只指1
<_sre.SRE_Match object; span=(1, 2), match='2'>
>>> re.search(r"\d","liuyujing") #匹配不到任何内容时,依然返回none
>>>
>>> re.search(r"中","liuyujing中") #也可匹配汉字
<_sre.SRE_Match object; span=(9, 10), match='中'>
5、匹配任意位置所有满足的字符串
1) 匹配出所有满足条件的字符串
>>> re.findall(r"ab","asabddabc")
['ab', 'ab']
2) 匹配出所有的数字
>>> re.findall(r"\d","liu1yu2jing3df") #查找任意位置满足条件的字符串
['1', '2', '3'] #以列表的方式返回
>>> re.findall(r"\d","liuyujingdf") #未匹配上,返回空列表
[]
#可通过判断返回值是否为空,判断是否有匹配上的内容
6、显示取到的结果
>>> re.search(r"中","liuyujing中").group()
'中'
>>> re.search(r"\d","d3sf5").group() #匹配到第一个结果便输出
'3'
>>> re.search(r"d","d3sf5").group()
'd'
>>> re.match(r"\d","d3sf5").group() #当未匹配上任何内容时使用group会报错
Traceback (most recent call last): #因为没有none.group()的用法
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
>>> re.findall(r"abc","deabchabcijk").group()#findall返回值不为空时,也不可使用group
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'group'
>> re.findall(r"ab","liuyujing").group() #当返回值是[]时,也不可使用.group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'group'
7、编译(将模式进行编译)
>>> pattern = re.compile(r"\d") #将查找数字编译到pattern中
>>> type(pattern) #pattern的类型也是正则表达式匹配结果的对象(匹配对象)
<class '_sre.SRE_Pattern'>
>>> pattern.match("1df").group() #pattern.match(目标字符串)
'1'
>>> pattern.search("d3fg").group() #pattern.search(目标字符串)
'3'
>>> pattern.findall("dkjf678djfd5") #pattern.findall(目标字符串)
['6', '7', '8', '5']
注意:pattern中,已经将匹配的模式(“\d”)编译,所以后续使用正则时,仅需要写match等匹配方法和目标字符串即可
好处:编译后,可以使用不同的匹配方法(match,search,findall),方便复用正则表达式
>>> pattern1 = re.compile(r"abc") #pattern1将模式“abc”进行了编译
>>> pattern1.match("abcdefghijk").group()
'abc'
>>> pattern1.search("deabchijk").group()
'abc'
>>> pattern1.findall("deabchabcijk").group() #findall不可与group()一起用
Traceback (most recent call last)
File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'group'
>>> pattern1.findall("deabchabcijk")
['abc', 'abc']
8、模式:
1) \d\D:匹配第一个任意数字后结束
>>> re.search(r"\d","ab1234df").group() #\d匹配第一个任意数字后结束
'1'
>>> re.search(r"\D","ab1234df").group() #\D匹配第一个非数字后结束
'a'
>>> re.search(r"\D","*b1234df").group() #特殊符号\D也可匹配
'*'
>>> re.search(r"\D","~b1234df").group() #特殊符号\D也可匹配
'~'
>>> re.search(r"\D"," b1234df").group() #空格\D也可匹配
' '
>>> re.search(r"\D","“b1234df").group() #单引号\D也可匹配
'“'
>>> re.search(r"\D","12b1234df").group() #匹配第一个非数字后结束
'b'
2) \w\W(匹配第一个所有的大小写字母和数字和下划线)
>>> re.search(r"\w"," a").group() w匹配的范围是:”a-z A-Z 0-9 _”
'a
>>> re.search(r"\w"," A").group() # w匹配的范围是:”a-z A-Z 0-9 _”
'A'
>>> re.search(r"\w"," ADS").group() #w匹配的范围是:”a-z A-Z 0-9 _”
'A'
>>> re.search(r"\w"," Z").group() #w匹配的范围是:”a-z A-Z 0-9 _”
'Z'
>>> re.search(r"\w"," _").group() #w匹配的范围是:”a-z A-Z 0-9 _”
'_'
>>> re.search(r"\w","中").group() #w根据系统的语言,可以匹配中文
'中'
>>> re.search(r"\W","*&*").group() #W匹配的范围是:非”a-z A-Z 0-9 _”
'*'
>>> re.search(r"\W"," &^").group()
' '
3) \s\S space空白(匹配第一个任意不可见的字符和空白字符后结束)
>>> re.search(r"\s","\t").group()
'\t'
>>> re.search(r"\s","\n").group()
'\n'
>>> re.search(r"\s","\r").group()
'\r'
>>> re.search(r"\s","() ").group()
' '
>>> re.search(r"\s"," ").group()
' '
>>> re.search(r"\s","[] ").group()
' '
>>> re.search(r"\S","[] ").group() #匹配到第一个非空白后结束
'['
>>> re.search(r"\S","\t a").group()
'a'
>>> re.search(r"\S","\t a!").group()
'a'
4) . 匹配非回车的所有字符,只会匹配一个字符
>>> re.findall(r"\D.S","Df %$DJS")
['DJS']
>>> re.search(r"a.b","a b").group() #.可匹配空格
'a b'
>>> re.search(r"f.b","df45b") #返回值为空,因为.只能匹配两者之间的一
>>> #个字符
>>> re.search(r"a.b","a\nb").group() #.不可匹配回车
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
>>> re.search(r".b","df4b").group() #.前面没有字母,可以匹配任何字母,只会
'4b' #匹配前面的一个字符
>>> re.search(r"f.","df4b").group() #.后面没有字母,可以匹配任何字母,只
'f4' #会匹配后面的一个字符
5) a.*b匹配ab之间所有的字符
>>> re.search(r"a.*b","djgdja*&82364}{?>_bdjfhd").group()
'a*&82364}{?>_b'
>>> re.search(r"a.*b","djgdja*&82364}{?>_bdjfhddfdfdb").group()
'a*&82364}{?>_bdjfhddfdfdb' #正则的贪婪性,匹配最多的ab之间的字符
>>> re.search(r"a.*?b","djgdja*&82364}{?>_bdjfhddfdfdb").group()
'a*&82364}{?>_b' #抑制正则的贪婪性,会滤掉后面的,只输出前面的ab之间的所有的内容
9、量词
1) + 匹配1次或多次
>>> re.search(r"\d+","dfg124df567").group() #匹配多个连续的数字
'124'
>>> re.search(r"\d+","dfg1df567").group() #匹配一个数字
'1'
>>> re.search(r"\s+","\t \n \r djdjdj123").group() #匹配多个连续的空格
'\t \n \r '
>>> re.search(r"\S+","!@#$GSFD DKF ").group()
'!@#$GSFD'
#尽量多的匹配,正则表达式的贪婪性
2) ? 最小匹配(抑制正则表达式的贪婪性)
>>> re.search(r"\w+?","!@#$GSFD DKF ").group() #?最小匹配(1个),抑制贪婪性
'G'
>>> re.search(r"\w+","!@#$GSFD DKF ").group() #不加?,可匹配一个或多个
'GSFD'
3) * 匹配0次或多次
>>> re.search(r"\w*","!@#$GSFD DKF ").group() #从头开始匹配,第一个字符是!,匹配了
'' #0次,所以返回为空
>>> re.search(r"\w*","GSFD DKF ").group()
'GSFD'
4) 匹配固定长度{}
>>> re.search(r"\w{3}","!@#$GSFD DKF ").group() #4+3,最先匹配4中的前3个
'GSF'
>>> re.search(r"\w{3}","!@#$DF %$DJS").group() #2+3,会匹配后面的3
'DJS'
5) 匹配可变范围长度的
>>> re.search(r"\w{2,3}","!@#$DF %$DJS").group() #匹配2-3次同时满足的字符串
'DF'
>>> re.search(r"\w{1,4}","!@#$Df %$DJS").group() #匹配1-4个满足条件的
'Df'
6)设定最小匹配长度
>>> re.search(r"\w{3,}","!@#$Df %$DJS").group() #匹配大于等于3次的正则
'DJS'
7) 设定最大匹配长度
>>> re.search(r"\w{,4}","!@#$Df %$DJS").group() #{,3}表示匹配0-3次,所以返回的是空
''
8) ? 0次或1次
>>> re.search(r"\w?","!@#$Df %$DJS").group() #匹配0次
''
>>> re.search(r"\w?","Df %$DJS").group() #匹配1次
'D'
>>> re.findall(r"\w?","Df %$DJS") #findall会进行每个字母的匹配,未匹配上便返回“”,到最后一个字母后,默认还会进行一次匹配
['D', 'f', '', '', '', 'D', 'J', 'S', '']
小练习:
输入字符串,如果字符串中有“ok”,则打印找到了,如果没有找到,则结束
>>> a = input("请输入一个字符串:")
请输入一个字符串:How are you?
>>> if re.search("ok",a):
... print("找到了")
... else:
... print("输入的字符串中没有ok")
...
输入的字符串中没有ok
>>> a = input("请输入一个字符串:")
请输入一个字符串:I am ok!
>>> if re.search("ok",a):
... print("找到了")
... else:
... print("输入的字符串中没有ok")
...
找到了
python入门(十六):正则的更多相关文章
- Python 爬虫十六式 - 第七式:正则的艺术
RE:用匹配来演绎编程的艺术 学习一时爽,一直学习一直爽 Hello,大家好,我是 Connor,一个从无到有的技术小白.上一次我们说到了 pyquery 今天我们将迎来我们数据匹配部分的最后一位 ...
- Python 爬虫十六式 - 第五式:BeautifulSoup-美味的汤
BeautifulSoup 美味的汤 学习一时爽,一直学习一直爽! Hello,大家好,我是Connor,一个从无到有的技术小白.上一次我们说到了 Xpath 的使用方法.Xpath 我觉得还是 ...
- Python 爬虫十六式 - 第六式:JQuery的假兄弟-pyquery
PyQuery:一个类似jquery的python库 学习一时爽,一直学习一直爽 Hello,大家好,我是 Connor,一个从无到有的技术小白.上一次我们说到了 BeautifulSoup 美味 ...
- Python爬虫十六式 - 第四式: 使用Xpath提取网页内容
Xpath:简单易用的网页内容提取工具 学习一时爽,一直学习一直爽 ! Hello,大家好,我是Connor,一个从无到有的技术小白.上一次我们说到了 requests 的使用方法.到上节课为止, ...
- Python爬虫十六式 - 第三式:Requests的用法
Requests: 让 HTTP 服务人类 学习一时爽,一直学习一直爽 Hello,大家好,我是Connor,一个从无到有的技术小白.今天我们继续来说我们的 Python 爬虫,上一次我们说到了 ...
- Python 爬虫十六式 - 第二式:urllib 与 urllib3
Python请求标准库 urllib 与 urllib3 学习一时爽,一直学习一直爽! 大家好,我是 Connor,一个从无到有的技术小白.上一次我们说到了什么是HTTP协议,那么这一次我们就要动 ...
- Python 爬虫十六式 - 第一式:HTTP协议
HTTP:伟大而又无闻的协议 学习一时爽,一直学习一直爽! Hello,大家好啊,我是Connor,一个从无到有的技术小白.有的人一说什么是HTTP协议就犯愁,写东西的时候也没想过什么是HTTP协 ...
- Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)
Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装: 将一些东西封装到一个地方,你还可以取出来( ...
- python入门(六):函数
1.系统自带的函数: >>> dir(__builtins__) ['ArithmeticError', 'AssertionError', 'AttributeError', 'B ...
- Python入门(六):标准库
操作系统接口 os模块提供了不少与操作系统相关联的函数. import os os.getcwd() # 返回当前的工作目录 os.chdir('d:/') # 修改当前的工作目录 os.system ...
随机推荐
- HLS自习(1)
HLS自习(1) 处理器的处理方式:
- ignoreDependencyType(Class class)方法使用
该方法字面意思是忽略依赖类,注释给出的解释是在自动装配时忽略指定类型的依赖注入. 经过我在网上查的资料,发现自动装配有两种方式: 一种是在xml配置文件中的<beans>标签中配置一个属性 ...
- note 7 递归函数
递归:程序调用自身 形式:在函数定义有直接或间接调用自身 阶乘:N!=123...N def p(n): x = 1 i = 1 while i <= n: x = x * i i = i + ...
- ASP.NET Core 1.1版本之Hello word
1.下载ASP.NET Core 1.1版本,并且安装. 2.新建一个工作文件夹,本文以WebApiFrame名称为例建立一个新的文件夹: mk WebApiFrame 3.启动命令行,在命令行中进入 ...
- Spring-MVC配置思路
前言: Spring-mvc是一个解决页面代码和后台代码分离的框架. 在没有配置servlet在服务器启动时就创建被创建时,总是当请求过来了servlet对象才会被创建 因此先从请求开始. 为了给每一 ...
- English 翻译到Vyeshal的软件
我或许可以做一个从英语到Vyeshal的翻译软件2333
- ubuntu 下安装mulval
怎么在虚拟机下安装ubuntu这里就不多说了 ubuntu怎么安装静态ip可以参考:https://www.cnblogs.com/braveym/p/8640563.html ubuntu安装jdk ...
- 初识git(17/8/21)
git是一个分布式的版本管理系统 通过廖雪峰的官方网站(maybe2017)来学习的,比较详实跟着操作就行,记录基本的一些命令还有学习是遇到的一些问题和收获,方便下次查阅. git的安装 -. win ...
- (Python基础)字符串操作
以下是我在学习过程中用的一些常用字符串操作的相关列子和具体注释,感兴趣的可以自己动手试试看 #字符串操作 name = 'my name is keep' print(name.capitalize( ...
- Hexo+Github博客最简教程-Dockerfile自动搭建
闲谈 拿出你的气质,打开你的电脑,借你半小时搭建好属于你的hexo博客,小生用dockerfile自动帮你搭建好:你只需要在你的mac或linux或windows上提前把docker安装好,如何安装不 ...