python中正则表达式功能由 re 模块提供: import re

两个主要函数:

  match  匹配第一个字符(从第一个字符开始匹配)
  search 匹配整个字符串

一、匹配单个字符

1、匹配某个字符(串)

text = 'hello'
ret = re.match('hel',text) # 从字第1个字符开始匹配,若不匹配就不会匹配到数据
# ret = re.search('l',text) # 在整个字符串中查找是否存在此字符
print(ret.group()) # hel

2、. 匹配任意字符,不能匹配到换行符 \n (指定flags=re.DOTALL 可匹配任何字符)

text = 'abc hello'
ret = re.match('.',text) # 匹配第一个字符
print(ret.group()) # a

3、\d 匹配任意的数字

text = '0a1'
ret = re.match('\d',text) # 匹配任意的数字
print(ret.group()) # 0

4、\D 匹配任意的非数字

text = 's0a1'
ret = re.match('\D',text) # 匹配任意的非数字
print(ret.group()) # s

5、\s 匹配任意空白字符(\n,\t,\r,空格)

text = '\ns0a1'
ret = re.match('\s',text) # 匹配任意空白字符
print(ret.group()) # 换行符

6、\w 匹配a-z、A-Z、数字、下划线

text = '2s0a1'
ret = re.match('\w',text) # 匹配a-z或A-Z、数字、下划线
print(ret.group()) # 2

7、\W 匹配和\w相反的字符

text = '$s0a1'
ret = re.match('\W',text) # 匹配a-z和A-Z、数字、下划线
print(ret.group())

8、[]组合的方式,满足中括号中的字符,就能匹配到

 a.匹配a或1

text = '1a1'
ret = re.match('[a1]',text) # 匹配a或1
print(ret.group()) # 1

 b.匹配数字、- 匹配一个:0

text = '028-888888'
ret = re.match('[\d\-]',text) # 匹配数字、- 匹配一个:0
print(ret.group())

 c.匹配数字、- 匹配多个:028-888888

text = '028-888888dd'
ret = re.match('[\d\-]+',text) # 匹配数字、- 匹配多个:028-888888
print(ret.group())

 d.中括号形式代替\d

text = '02334'
ret = re.match('[0-9]',text) # 匹配0-9的数字
print(ret.group()) # 0

 e.中括号形式代替\D

text = 'g02334'
ret = re.match('[^0-9]',text) # 匹配非0-9的字符
print(ret.group()) # g

 f.中括号形式代替\w

text = 'G02334'
ret = re.match('[a-zA-Z0-9_]',text) # 匹配a-z和A-Z、数字、下划线
print(ret.group()) # G

 g.中括号形式代替\W

text = '%02334'
ret = re.match('[^a-zA-Z0-9_]',text) # 匹配非a-z和A-Z、数字、下划线
print(ret.group()) # %

二、匹配多个字符

1、* 匹配0或多个字符

text = '028'
ret = re.match('\d*',text) # 匹配任意多个数字
print(ret.group()) # 028

2、+ 匹配1个或多个字符

text = 's0\ta1'
ret = re.match('\w+',text) # 匹配1个或多个字符
print(ret.group()) # s0

3、? 匹配0个或1个字符

text = '@s0\ta1'
ret = re.match('\w?',text) # 匹配0个或1个字符
print(ret.group()) # 匹配到0个

4、{m} 匹配m个字符(或表达式)

text = 'a2daf'
ret = re.match('\w{2}',text) # 匹配2个字符(或表达式)
print(ret.group()) # a2

5、{m,n} 匹配m至n个字符

text = 'a2daffdsdf'
ret = re.match('\w{2,5}',text) # 匹配2到7个字符个字符
print(ret.group()) # a2daf

三、常用案例

1、验证手机号码:1开头,第二位34578中任意一位,后面9位任意数字

text = '15123456789'
ret = re.match('1[34578]\d{9}',text)
# text = '1512345678' # 后面只有8位,不能匹配到
print(ret.group()) # 15123456789

2、验证邮箱

text = 'dasd1231@qq.com'
ret = re.match('\w+@[a-z0-9]+\.[a-z]+',text)
print(ret.group()) # dasd1231@qq.com

3、验证url

text = 'http://www.baidu.com'
ret = re.match('(http|https|ftp)://[^\s]+',text) # | 或的意思
print(ret.group()) # http://www.baidu.com

4、验证身份证,一共18位,最后一位可能是数字,x,X

text = '12345678901234567x'
ret = re.match('\d{17}[xX\d]',text)
print(ret.group()) # 12345678901234567x

5、^(脱字号) 以什么开始

text = 'sdfsdg'
ret = re.match('^s',text) # 以s开头
print(ret.group()) # s

6、$ 以什么结尾

text = 'sdfsdg.com'
ret = re.search('\w+.com$',text) # 以.com结尾
print(ret.group()) # sdfsdg.com

7、| (或的意思) 匹配多个表达式或字符串

text = 'sdfsdg.cndas'
ret = re.search('\w+(.com|.cn)',text) # 以.com或.cn 结尾
print(ret.group()) # sdfsdg.cn

8、? 贪婪模式和非贪婪模式:

  贪婪模式:正则表达式会匹配尽量多的字符。默认是贪婪模式。

  非贪婪模式:正则表达式会尽量少的匹配字符。

 a.贪婪模式

text = '2342334'
ret = re.search('\d+',text) # 匹配任意个数字
print(ret.group()) # 2342334
text = '<b> dasd </b>'
ret = re.search('<.+>',text) # 匹配任意个字符
print(ret.group()) # <b> dasd </b>

 b.非贪婪模式

text = '2342334'
ret = re.search('\d+?',text) # 匹配最少个数数字
print(ret.group()) # 2
text = '<b> dasd </b>'
ret = re.search('<.+?>',text) # 匹配最少字符
print(ret.group()) # <b>

 c匹配0-100之间的数字

text = '34'
ret = re.match('0?$|[1-9]\d?$|100$',text) # 匹配最少个数数字
print(ret.group()) # 34

四、转义字符、原生字符串

  转义字符:某些字符前面加\表示特殊意义,例:

print('\n')  # 输出换行

  原生字符串:字符串前面加上 r 表示原生字符串,例:

print(r'\n')  # 输出 \n,而不是换行

 特例:输出 \n

  转义字符格式:

text = '\\n'
ret = re.match('\\\\n',text) # 转义字符格式
print(ret.group()) # \n

  原生字符格式:

text = '\\n'
ret = re.match(r'\\n',text) # 原生字符
print(ret.group()) # \n

五、re模块中常用函数

 1、group :提取分组截获的字符串,使用()分组

  通过实例说明:

text = 'sasdd $99 fsdf $88'
ret = re.search('.*(\$\d+).*(\$\d+)',text)
print(ret.group()) # 获取整个匹配结果 和 print(ret.group(0) 一样
print(ret.group(1)) # 获取第一个分组 $99
print(ret.group(2)) # 获取第二个分组 $88
print(ret.group(1,2)) # 获取第一、二个分组 ('$99', '$88')
print(ret.groups()) # 获取所有子分组

 2、findall 找出所有满足条件的,返回一个列表。

text = 'sasdd $99 fsdf $88'
ret = re.findall('\$\d+',text)
print(ret) # ['$99', '$88']

 3、sub 将匹配到的字符串替换为其他字符串。

  a.将$替换成¥

text = 'sasdd $99 fsdf $88'
ret = re.sub('\$','¥',text)
print(ret) # sasdd ¥99 fsdf ¥88

  b.剔除掉所有的html标签符号及其内容

html = '''
<div class="abc">
<p>第1段</p>
<p>第2段</p>
<p>第3段</p>
'''
ret = re.sub('<.+?>','',html)
print(ret)
# 返回
'''
# 第一个换行符替换成空
# <div class="abc"> 替换成空
第1段
第2段
第3段
'''

 4、split:使用正则表达式来分割字符串,返回列表

  a.使用空格分割

text = 'sds sfaff 1214'
ret = re.split(' ',text)
print(ret) # ['sds', 'sfaff', '1214']

  b.使用数字分割

text = 'sds32sfaff23ffsf'
ret = re.split('\d+',text)
print(ret) # ['sds', 'sfaff', 'ffsf']

 5、compile 提前定义(编译)好正则,后续直接使用。

  指定flag=re.VERBOSE时,可添加注释信息。

  a.获取 $20.50

text = "asd sddfe fefe $20.50"
r = re.compile('\d+\.?\d*')
ret = re.search(r,text)
print(ret.group())

  b.获取 $20.50,并添加注释信息

text = "asd sddfe fefe $20.50"
r = re.compile(r'''
\d+ # 小数点前面的数字
\.? # 小数点,小数点可有可无
\d* # 小数点后面的数字,小数点后面数字可有可无
''',re.VERBOSE)
ret = re.search(r,text)
print(ret.group())

初识python 之 爬虫:正则表达式的更多相关文章

  1. 初识python 之 爬虫:使用正则表达式爬取“糗事百科 - 文字版”网页数据

    初识python 之 爬虫:使用正则表达式爬取"古诗文"网页数据 的兄弟篇. 详细代码如下: #!/user/bin env python # author:Simple-Sir ...

  2. 初识python 之 爬虫:使用正则表达式爬取“古诗文”网页数据

    通过requests.re(正则表达式) 爬取"古诗文"网页数据. 详细代码如下: #!/user/bin env python # author:Simple-Sir # tim ...

  3. 初识python 之 爬虫:爬取双色球中奖号码信息

    人生还是要有梦想的,毕竟还有python.比如,通过python来搞一搞彩票(双色球).注:此文仅用于python学习,结果仅作参考.用到知识点:1.爬取网页基础数据2.将数据写入excel文件3.将 ...

  4. 初识python 之 爬虫:爬取中国天气网数据

    用到模块: 获取网页并解析:import requests,html5lib from bs4 import BeautifulSoup 使用pyecharts的Bar可视化工具"绘制图表& ...

  5. 初识python 之 爬虫:爬取豆瓣电影最热评论

    主要用到lxml的etree解析网页代码,xpath获取HTML标签. 代码如下: 1 #!/user/bin env python 2 # author:Simple-Sir 3 # time:20 ...

  6. 初识python 之 爬虫:爬取某电影网站信息

    注:此代码仅用于个人爱好学习使用,不涉及任何商业行为!  话不多说,直接上代码: 1 #!/user/bin env python 2 # author:Simple-Sir 3 # time:201 ...

  7. 初识python 之 爬虫:爬取某网站的壁纸图片

    用到的主要知识点:requests.get 获取网页HTMLetree.HTML 使用lxml解析器解析网页xpath 使用xpath获取网页标签信息.图片地址request.urlretrieve ...

  8. 初识python 之 爬虫:BeautifulSoup 的 find、find_all、select 方法

    from bs4 import BeautifulSoup lxml 以lxml形式解析html,例:BeautifulSoup(html,'lxml') #  注:html5lib 容错率最高fin ...

  9. [Python] 网络爬虫和正则表达式学习总结

    以前在学校做科研都是直接利用网上共享的一些数据,就像我们经常说的dataset.beachmark等等.但是,对于实际的工业需求来说,爬取网络的数据是必须的并且是首要的.最近在国内一家互联网公司实习, ...

随机推荐

  1. eclips 配置一个tomcat,启动多个不同端口的web项目

    前提: 记录这个文章是因为在网上查资料,很多都是,用eclips.配置多个tomcat,就像下面图这样配置两个tomcat 去启动不同的web: 运动多个web 项目,设置不同的端口,需要多个tomc ...

  2. 【Java多线程】CompletionService

    什么是CompletionService? 当我们使用ExecutorService启动多个Callable时,每个Callable返回一个Future,而当我们执行Future的get方法获取结果时 ...

  3. ClassLoader.loadClass()与Class.forName()的区别《 转》

    ClassLoader.loadClass()与Class.forName()区别: ClassLoader.loadClass()与Class.forName()大家都知道是反射用来构造类的方法,但 ...

  4. 【力扣】973. 最接近原点的 K 个点

    我们有一个由平面上的点组成的列表 points.需要从中找出 K 个距离原点 (0, 0) 最近的点. (这里,平面上两点之间的距离是欧几里德距离.) 你可以按任何顺序返回答案.除了点坐标的顺序之外, ...

  5. 「Python实用秘技01」复杂zip文件的解压

    本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的新系列文章「Python实用秘技」的第1 ...

  6. 记ByteCTF中的Node题

    记ByteCTF中的Node题 我总觉得字节是跟Node过不去了,初赛和决赛都整了个Node题目,当然PHP.Java都是必不可少的,只是我觉得Node类型的比较少见,所以感觉挺新鲜的. Nothin ...

  7. 去除爬虫采集到的\xa0、\u3000等字符

    \xa0表示不间断空白符,爬虫中遇到它的概率不可谓不小,而经常和它一同出现的还有\u3000.\u2800.\t等Unicode字符串.单从对\xa0.\t.\u3000等含空白字符的处理来说,有以下 ...

  8. Linux 01 计算机硬件之冯诺依曼体系

    1. 计算机硬件软件体系 1.1 冯诺依曼体系结构 (1) 计算机处理的数据和指令用二进制表示 (2) 按顺序执行指令 (3) 计算机硬件:运算器.控制器.储存器.输入设备和输出设备. 1.2 计算机 ...

  9. 我在这里的处女篇(Word技巧集团)

    传说这里的文章可以在Word上打好了发布,Word嘛,有[听写]功能,不用打字了: 写好的文章还可以[大声朗读],边听边看最容易找"通假字"了. 冲这,我的新阵地就定这里了,哈哈~

  10. ABP VNext框架中Winform终端的开发和客户端授权信息的处理

    在ABP VNext框架中,即使在它提供的所有案例中,都没有涉及到Winform程序的案例介绍,不过微服务解决方案中提供了一个控制台的程序供了解其IDS4的调用和处理,由于我开发过很多Winform项 ...