python正则表达式及RE模块

正则表达式(匹配字符串)
web界面正则匹配工具:
http://tool.chinaz.com/regex/

元字符

 1 .   匹配除换行符之外的任意字符
 2 \w  匹配数字字母下划线
 3 \d  匹配数字
 4 \t  匹配制表符
 5 \n  匹配换行符
 6 \s  匹配空白符(包含,空格,制表符和换行符)
 7 \b  单词的边界
 8 \W  匹配非数字字母下划线
 9 \S  匹配非空白符
10 \D  匹配非数字
11 ^       匹配开始符
12 $       匹配结束符
13 |       或者,如果是有包含关系的,长的放左边
14 []      匹配字符组,具体的范围
15 [^...]  匹配非字符组中的字符
16 ()      匹配括号内的是一组
17
18
19 转义符
20 如果在测试工具中测试正常的代码拿到python中,由于转义符的问题搞不定,那么就直接在字符串外面+r
21 print(‘\\\\n‘)
22 print(‘\\n‘)
23 print(r‘\\n‘)
24 print(r‘\n‘)
25
26 事例:
27 www\.(baidu|google)\.com
28 [0-9] == [0123456789] #表示0到9的所有数
29 [a-z]/[A-Z]     表示a到z/A-Z所有英文字母
30 [A-Za-z0-9]     表示数字和大小写字母
31
32
33 量词
34 贪婪匹配: 尽可能多的匹配(默认模式)
35 {n}     匹配n次
36 {n,}    匹配至少n次至多无限次
37 {n,m}   匹配至少n次至多m次
38 *       匹配前面字符0次或多次
39 +       匹配前面字符1次或多次
40 非贪婪/惰性匹配
41 ?       匹配前面字符0次或1次(.*?)
42 abbbx   正则^ab+?x,如果正则是^ab+?结果则是ab
43
44
45 总结
46 正则表达式: 不仅仅要能匹配出对的,还要尽量避免匹配错误的,提高精准度
47 分组的作用: 分组也可以和量词连用,表示这一个组遵循某个量词的约束
48
49 常用的非贪婪匹配
50 *?      重复任意次,但尽可能少重复
51 .*?     匹配前边任意字符,尽可能少的匹配
52 +?      重复1次或更多次,但尽可能少重复
53 ??      重复0次或1次,但尽可能少重复
54 .?x     取尽量少的任意字符,直到一个x出现

re的功能是在python中执行正则表达式
re模块下的常用方法
import re
re.findall  正则 待匹配字符串,列表,所有符合的项
re.search    变量.group取结果,只有一项结果
re.match     变量.group取结果,默认在正则之前加上^
re.finditer 把匹配的结果存放在迭代器中

re.findall(‘正则表达式‘,‘带匹配的字符‘)

 1 re.findall(‘正则表达式‘,‘带匹配的字符‘)
 2 ret = re.findall(‘\d+‘,‘aaa83bbb38‘)
 3 print(ret)
 4 结果
 5 [‘83‘, ‘38‘]
 6 事例2
 7 ret = re.findall(‘\d‘,‘aaa83bbb38‘)
 8 print(ret)
 9 结果
10 [‘8‘, ‘3‘, ‘3‘, ‘8‘]
11
12 # ?:把括号python中的分组变成了原来正则表达式中的分组
13 lst = re.findall(r"a(?:\d+)c", "a123456c")
14 l2 = re.findall(r"a(\d+)c", "a123456c")
15 print(lst)
16 print(l2)
17 结果
18 [‘a123456c‘]
19 [‘123456‘]

re.finditer()   #返回一个存放匹配结果的迭代器,节省空间

 1 ret = re.finditer(‘\d+‘,‘linux83admin60yuan25‘)
 2 print(ret)                  #直接打印返回的是一个迭代器
 3 print(next(ret).group())    #查看第1个结果
 4 for r in ret:               #查看剩余的结果
 5     print(r.group())
 6 结果
 7 <callable_iterator object at 0x000001FF0EACEBA8>
 8 83
 9 60
10 25

search 搜索, 查找
一旦匹配到结果,直接返回,如果匹配不到结果,返回None

 1 ret = re.search(‘\d‘,‘aaa83bbb38‘)
 2 print(ret)          #返回的匹配结果,而不是具体的值
 3 print(ret.group())  #从左到右找到第一个匹配的取出
 4 结果
 5 <_sre.SRE_Match object; span=(4, 5), match=‘8‘>
 6 8
 7
 8 ret = re.search(‘\d+‘,‘aaa83bbb22‘)
 9 print(ret.group())
10 结果
11 83

match匹配,从头开始匹配,相当于在你正则前面加了一个^

1 ret = re.match(‘\d+‘,‘83aaa222bbb38‘)
2 print(ret.group())
3 等于
4 ret = re.search(‘^\d+‘,‘83aaa222bbb38‘)
5 print(ret)
6 结果
7 83

search和match的区别:
search查找,找到了结果就返回
match,从头开始匹配

给分组正则匹配定义一个名字(?P<名字>正则表达式)

1 ret = re.finditer(r‘姓名:(?P<name>.*?),地址:(?P<address>.*?),‘,‘姓名:bob,地址:迪拜,年龄:18‘)
2 for i in ret:
3     print(i.group(‘name‘),i.group(‘address‘))
4 结果
5 bob 迪拜

re.split():分割

1 st = ‘linux83admin60yuan25test‘
2 ret = re.split(‘\d+‘,st)     #按照一个或多个数字进行分割
3 print(ret)
4 结果
5 [‘linux‘, ‘admin‘, ‘yuan‘, ‘test‘]

sub用正则替换

1 s = ‘linux83admin60yuan25‘
2 ret  = re.sub(‘\d+‘,‘_|_‘,s,1)  #将一个或多个数字替换为_|_,1表示只替换1个,以字符串形式返回
3 print(ret)
4 结果
5 linux_|_admin60yuan25

subn显示替换次数

1 ret  = re.subn(‘\d+‘,‘_|_‘,s)  #将一个或多个数字替换为_|_,以元组形式返回
2 print(ret)
3 结果
4 (‘linux_|_admin_|_yuan_|_‘, 3)

re.compile():编译后引用正则匹配(返回列表)

1 ret = re.compile(‘\d+‘) #将正则编译成一个正则对象,匹配一个或多个数字
2 lst = ret.findall(‘linux83admin60yuan25‘)
3 print(lst)
4 在多次执行同一个正则表达式的时候compile事先编译

案例:爬取电影天堂

 1 import re
 2 from urllib.request import urlopen
 3
 4 content = urlopen("https://www.dytt8.net/html/gndy/dyzz/20181228/57986.html").read().decode("gbk")
 5 # print(content)
 6
 7 reg = r‘<div id="Zoom">.*?片  名(?P<name>.*?)<br />◎年  代(?P<years>.*?)<br />.*?◎上映日期(?P<date>.*?)<br />‘+  8 ‘.*?◎主  演(?P<main>.*?)◎简  介.*?<td style="WORD-WRAP: break-word" bgcolor="#fdfddf"><a href="(?P<download>.*?)">‘
 9
10 it = re.finditer(reg, content, re.S)    # re.S 去掉.里面的\n
11
12 for el in it:
13     print(el.group("name"))
14     print(el.group("years"))
15     print(el.group("date"))
16     print(el.group("main").replace("<br />      ", ", "))
17     print(el.group("download"))
18
19 结果
20  黄金兄弟 / 新古惑仔 / 新版古惑仔 / 黄金七十二小时
21  2018
22  2018-09-20(中国香港) / 2018-09-21(中国)
23  郑伊健 Ekin Cheng , 陈小春 Jordan Chan , 谢天华 Michael Tse , 钱嘉乐 Kar Lok Chin , 林晓峰 Jerry Lamb , 曾志伟 Eric Tsang , 佘诗曼 Charmaine Sheh , 张雅玫 Yamei Zhang <br /><br />
24 ftp://ygdy8:[email protected]:8373/阳光电影www.ygdy8.com.黄金兄弟.BD.720p.粤语中字.mkv

其他

 1 事例1
 2 ret = re.findall(r‘\d+(\.\d+)?‘,‘2.34+666.87‘)
 3 print(ret)
 4 结果
 5 [‘.34‘, ‘.87‘]
 6 #\d+ = 2    (\.\d+) = .34
 7 #\d+ = 666  (\.\d+) = .87
 8 #findall 优先显示分组中匹配到的内容
 9
10 #如果想匹配浮点数就要把默认的非婪模式改为?:贪婪模式
11 ret = re.findall(r‘\d+(?:\.\d+)?‘,‘2.34+666.87‘)
12 print(ret)
13 结果
14 [‘2.34‘, ‘666.87‘]
15
16
17 事例2
18 ret = re.findall(‘www\.(?:baidu|google)\.com‘,‘www.baidu.com‘)
19 print(ret)
20 结果
21 [‘www.baidu.com‘]
22
23 ret = re.findall(‘www\.(baidu|google)\.com‘,‘www.baidu.com,www.google.com‘)
24 print(ret)
25 结果
26 [‘baidu‘, ‘google‘]
27
28
29 ()组事例
30 ret = re.search(‘(www)\.(baidu|google)\.(com)‘,‘www.baidu.com,www.google.com‘)
31 print(ret)
32 print(ret.group())
33 print(ret.group(0))
34 print(ret.group(1))
35 print(ret.group(2))
36 print(ret.group(3))
37 结果
38 <_sre.SRE_Match object; span=(0, 13), match=‘www.baidu.com‘>
39 www.baidu.com
40 www.baidu.com
41 www
42 baidu
43 com

原文地址:https://www.cnblogs.com/linuxcbb/p/9960202.html

时间: 2024-11-04 01:06:57

python正则表达式及RE模块的相关文章

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

python正则表达式之re模块其他方法 1:search(pattern,string,flags=0) 在一个字符串中查找匹配 2:findall(pattern,string,flags=0) 找到匹配,返回所有匹配部分的列表 In [1]: import re In [2]: str1 = 'imoooc videonum = 1000' In [3]: str1.find('1000') Out[3]: 18 In [4]: info = re.search(r'\d+',str1)

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

摘录 python核心编程 python的re模块允许多线程共享一个已编译的正则表达式对象,也支持命名子组.下表是常见的正则表达式属性: 函数/方法 描述 仅仅是re模块函数 compile(pattern,flags=0) 使用任何可选的标记来编译正则表达式的模式 ,然后返回一个正则表达式对象 re模块函数和正则表达式对象的方法 match(pattern,string,flags=0) 尝试使用带有可选标记的正则表达式的模式来匹配字符串,成功则返回匹配的对象,失败则返回None search

python正则表达式与re模块

python中的re模块常用函数/方法 0.正则表达式对象 (re.compile(pattern, flags=0)) 将正则表达式编译成正则表达式对象,该对象可调用正则表达式对象方法如:re.match(),re.search(),re.findall等. prog = re.compile(pattern) result = prog.match(string) //上下两种写法意义相同 result = re.match(pattern, string) 1.匹配对象及方法       

python 正则表达式与re模块

一.正则表达式 用途 用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑. #### 简单地说 就是用于字符串匹配的 字符组 在同一个位置可能出现的各种字符组成的一个字符组,在正则表达式中用[]表示 例子: 规则:[0123456789] 待匹配:8 匹配结果:True 规则:[0-9] 待匹配:6 匹配结果:True 规则:[a-z] 待匹配:c 匹配结果:True 规则:[A-Z] 待匹配:

Python 正则表达式、re模块

一.正则表达式 对字符串的操作的需求几乎无处不在,比如网站注册时输入的手机号.邮箱判断是否合法.虽然可以使用python中的字符串内置函数,但是操作起来非常麻烦,代码冗余不利于重复使用. 正则表达式是一种特殊的字符串序列,使用它可以非常方便的匹配一个字符串是否合法. 1)判断手机号是否合法:根据手机号码一共11位并且是只以13.15.18.17开头的数字这些特点,我们用python写了如下代码: content = input('>>>') if content.isdigit(): i

python正则表达式之re模块使用

python第一个正则表达式 r'imooc'  Pattern Match result In [2]: import re In [3]: pa = re.compile(r'imooc') #re的compile方法生成pattern对象 In [4]: type(pa) Out[4]: _sre.SRE_Pattern In [5]: pa. pa.findall pa.fullmatch pa.match pa.search pa.subn pa.finditer pa.groupin

常见的爬虫分析库(3)-Python正则表达式与re模块

在线正则表达式测试 http://tool.oschina.net/regex/ 常见匹配模式 模式 描述 \w 匹配字母数字及下划线 \W 匹配非字母数字下划线 \s 匹配任意空白字符,等价于 [\t\n\r\f]. \S 匹配任意非空字符 \d 匹配任意数字,等价于 [0-9] \D 匹配任意非数字 \A 匹配字符串开始 \Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 \z 匹配字符串结束 \G 匹配最后匹配完成的位置 \n 匹配一个换行符 \t 匹配一个制表符 ^ 匹配字

python开发中对正则表达式及re模块的学习

正则表达式是个很牛逼的东西,不管是在javascript,还是在Python web开发(http://www.maiziedu.com/course/python-px/)中,我们都会遇到正则表达式,虽然javascript和Python的正则表达式区别不大,但是正则表达式是Python中必不可少的一部分,所以今天就跟大家一起讨论一下python中的re模块. re模块包含对正则表达式的支持. 什么是正则:  正则表达式是可以匹配文本片段的模式.  正则表达式'Python'可以匹配'pyth

Python中正则表达式(re模块)的使用

1.正则表达式的概述 (1)概述:正则表达式是一些由字符和特殊符号组成的字符串,他们描述了模式的重复或者表示多个字符,正则表达式能按照某种模式匹配一系列有相似特征的字符串.正则表达式是一种小型的.高度的专业化的编程语言, (2)Python语言中的正则表达式内嵌在Python中通过re模块实现,正则表达式被编译成一系列的字节码,然后由C编写的匹配引擎执行 2.字符匹配 (1)符号匹配 符号 描述 示例 实例说明 literal 匹配文本字符串的字面值literal root 匹配字符串root