正则,re模块

一、正则表达式(精准匹配)

  匹配字符串内容的一种规则

二、字符组

  在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示

  常见字符组格式如下:[0123456789],[0-9],[a-z],[A-Z],必须由从小到大,不可逆序。

三、主要元字符

[^s]除了s不能匹配

a|b == [ab]

表示匹配任意字符:[\w\W],[\d\D],[\s\S]

熟记(。,\w , \d ,^ ,$ ,a|b , () ,[...] ,[^...])

元字符 匹配内容 元字符 匹配内容
. 匹配除换行符以外的任意字符 $ 匹配字符串的结尾
\w 匹配字母或数字或下划线(word) \W 匹配非字母或数字或下划线
\s 匹配任意的空白符(space) \S 匹配非空白符
\d 匹配数字(digit) \D 匹配非数字
\n 匹配一个换行符(next) a|b 匹配字符a或字符b
\t 匹配一个制表符(table) () 匹配括号内的表达式,也表示一个组
\b 匹配一个单词的结尾 [...] 匹配字符串中的字符
^ 匹配字符串的开始 [^...] 匹配除了字符串中字符的所有字符
# . ^ $ 例子
import re
obj1 = re.findall(‘海.‘,‘海燕海南海西‘)
print(obj1)  # [‘海燕‘, ‘海南‘, ‘海西‘] 匹配所有带‘海’的字符
obj1 = re.findall(‘^海.‘,‘海燕海南海西‘)
print(obj1)  # [‘海燕‘] 只从开头匹配带海的字符
obj1 = re.findall(‘海.$‘,‘海燕海南海西‘)
print(obj1)  # [‘海西‘]  只匹配结尾带海的字符

量词:

由于贪婪匹配的原因,在满足匹配条件的情况下,默认按贪婪匹配,即尽可能多的匹配字符串,若在量词后面加上?,即可

将贪婪匹配更改为非贪婪匹配,即匹配尽量短的字符串,常见量词及其主要用法如下:

贪婪模式:

量词 用法说明 量词 用法说明
* 重复零次或更多次 {n} 重复n次
+ 重复一次或更多次 {n,} 重复n
? 重复零次或一次 {n,m} 重复n到m次
import refunc1 = re.findall(‘李.?‘,‘李杰和李立秋和李梵高先生‘)
print(func1)  # [‘李杰‘, ‘李立‘, ‘李梵‘] ?表示匹配0或者1次,即匹配李后面任意字符1次
func2 = re.findall(‘李.*‘,‘李杰和李立秋和李梵高先生‘)
print(func2)  # [‘李杰和李立秋和李梵高先生‘] *表示匹配0次或多次
func3 = re.findall(‘李.+‘,‘李杰和李立秋和李梵高先生‘)
print(func3)  # [‘李杰和李立秋和李梵高先生‘]  + 表示匹配1次或多次
func4 = re.findall(‘李.{1,2}‘,‘李杰和李立秋和李梵高先生‘)
print(func4)  # [‘李杰和‘, ‘李立秋‘, ‘李梵高‘]  {1,2}  表示匹配1到2次,即匹配李后面任意字符2次

非贪婪模式:

非贪婪模数 用法说明
*? 重复0次或更多次,但尽可能少重复
+?
重复1次或更多次,但尽可能少重复
??
重复0次或1次,但尽可能少重复
{n,}?
重复n次以上,但尽可能少重复
{n,m}?
重复n到m次,但尽可能少重复
func4 = re.findall(‘李.{1,2}?‘,‘李杰和李立秋和李梵高先生‘)
print(func4)  # [‘李杰‘, ‘李立‘, ‘李梵‘] ,重复1次
func5 = re.findall(‘李.??‘,‘李杰和李立秋和李梵高先生‘)
print(func5)  # [‘李‘, ‘李‘, ‘李‘] ,重复0次
func6= re.findall(‘李.+?‘,‘李杰和李立秋和李梵高先生‘)
print(func6)  # [‘李杰‘, ‘李立‘, ‘李梵‘] ,重复1次
func7= re.findall(‘李.*?‘,‘李杰和李立秋和李梵高先生‘)
print(func7)  # [‘李‘, ‘李‘, ‘李‘] ,重复0次

字符集 [ ] [^]

func8 = re.findall(‘李.[杰立秋梵高先生]*‘,‘李杰和李立秋和李梵高先生‘)
print(func8)   # [‘李杰‘, ‘李立秋‘, ‘李梵高先生‘]  表示匹配"李"字后面[杰立秋梵高先生]的字符任意次
func9 = re.findall(‘李.[^和]*‘,‘李杰和李立秋和李梵高先生‘)
print(func9)   # [‘李杰‘, ‘李立秋‘, ‘李梵高先生‘]  表示匹配李后面不是和的任意字符
func10 = re.findall(‘[\d]‘,‘1220shi6‘)
print(func10)  # func10 = re.findall(‘[\d]*‘,‘1220shi6‘)
print(func10)  # [‘1‘, ‘2‘, ‘2‘, ‘0‘, ‘6‘]   表示匹配任意一个数字
func11 = re.findall(‘[\d]*‘,‘1220shi6‘)
print(func11)  # [‘1220‘, ‘‘, ‘‘, ‘‘, ‘6‘, ‘‘]
func12 = re.findall(‘[\d]+‘,‘1220shi6‘)
print(func12)  # [‘1220‘, ‘6‘]   表示匹配任意个数字

分组()与或|

  身份证号码是由15位或者18位的字符组成,如果是15位,首位不能是0,其他位数均为数字,如果是18位,则最后一位可能  是数字或者X,用正则表达式匹配的两种方式如下:

正则表达式 结果说明
^[1-9]\d{14}(\d{2}[0-9x])?$
()表示分组,将\d{2}[0-9x]分成一组,就可以整体约束他们出现的次数为0-1次
^([1-9]\d{16}[0-9x]|[1-9]\d{14})$
表示先匹配[1-9]\d{16}[0-9x]如果没有匹配上就匹配[1-9]\d{14}

转义符\

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

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

四、re模块主要方法

findall 找所有,返回列表
search 找第一个,返回值.group()
match 从开始匹配
split 根据正则表达式去切割
sub/subn 根据正则表达式去替换
compile 编译正则
finditer 找所有,返回迭代器,

1、findall():返回所有符合匹配条件的

import re
ret = re.findall(‘a‘, ‘eva egon yuan‘)
print(ret)                           #结果 : [‘a‘, ‘a‘]

2、search():在字符串内进行匹配,直到找到第一个后,返回一个包含匹配信息的匹配对象,可以通过group()对匹配对象取出匹配的字符串,如果没有匹配的字符串,则返回None,通过group()取值会报错

import re
ret = re.search(‘a‘, ‘eva egon yuan‘).group()
print(ret)                           #结果 : ‘a‘

3、match():在字符串开头进行匹配,返回一个包含匹配信息的匹配对象,可以通过group()方法调用匹配对象,取出匹配的字符串,如果没有匹配的字符串,则返回None,通过group()取值会报错。

import re
ret = re.match(‘h‘, ‘abc‘)
print(ret)                           #返回None
res = re.match(‘a‘, ‘abc‘)
print(res.group())                  #返回‘a‘

4、split():按照正则表达式的要求对字符串分割,返回分割后的列表

import re
ret=re.split(‘[ab]‘,‘abcd‘)         #先按‘a‘分割得到‘‘和‘bcd‘,在对‘‘和‘bcd‘分别按‘b‘分割
print(ret)                          #结果:[‘‘, ‘‘, ‘cd‘]

5、sub():替换字符串中的内容,与字符串方法replace()相似

import re
ret=re.sub(‘\d‘,‘H‘,‘av23nb4g4‘,2)  #将字符串中的数字替换为‘H’,其中2代表只替换前两个,默认全部替换
print(ret)                          #输出结果:avHHnb4g4

6、subn()替换字符串中的内容,返回一个元组,包含替换结果的字符串及替换次数

import re
ret=re.subn(‘\d‘,‘H‘,‘av23nb4g4‘)
print(ret)                          #输出结果:(‘avHHnbHgH‘, 4)

7、

obj = re.compile(‘\d{3}‘)  #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
ret = obj.search(‘abc123eeee‘) #正则表达式对象调用search,参数为待匹配的字符串
print(ret.group())  #结果 : 123

8、finditer(): 节省内存

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])  #查看剩余的左右结果
时间: 2024-08-02 19:48:09

正则,re模块的相关文章

python正则--re模块常用方法

前面几篇关于正则匹配的文章我用的方法都只有一个re.search 但其实正则re模块提供很多非常好用的方法,我们先来看看re模块都有那些属性方法呢 前面的一堆带_或者大写的就不关注了,主要关注最后面的几个方法 -------------------------------------------------------------------------------------------------------------------------------------------------

python - re正则匹配模块

re模块 re 模块使 Python 语言拥有全部的正则表达式功能. compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象.该对象拥有一系列方法用于正则表达式匹配和替换. re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数. re.match函数 re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none. # (匹配规则,字符串,特殊标志) re.match(pattern

复习&amp;正则&amp;re模块

正则 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串.将匹配的子串替换或者从某个串中取出符合某个条件的子串等. re模块 1.Re模块简介 re模块是python中处理正则表达式的一个模块,通过re模块的方法,把正则表达式pattern编译成正则对象,以便使用正则对象的方法 效率问题: import re import timeit print(timeit.timeit(setup='''import re;

python正则re模块

今日内容: 知识点一:正则 什么是正则:  就是用一系列具有特殊含义的字符组成一套规则,改规则用来描述具有某一特征的字符串  正则就是用来在一个大的字符串中取出符合规则的小字符串   为什么用正则:  1.用户注册  2.爬虫程序   如何用:  re.findall re.findall模块: \w取字母.数字.下划线print(re.findall('\w','yangzz:age_18 '))\W取非字母.数字.下划线print(re.findall('\W','yangzz:age_18

python之正则re模块

1.正则的语法:  中文教程:https://wizardforcel.gitbooks.io/py-re-guide/content/index.html 1.re的数量词: 1. ^   匹配度字符串开始位置 2. $   匹配字符串结束的地方: tr = 'jgko22rkdljgkd' r2 = re.findall('^jgkd', tr) print(r2) # []是空的 r4 = re.findall('^jgko', tr) print(r4) # ['jgko'] r3 =

递归&amp;装饰器&amp;正则运算&amp;模块

递归: def f(a): if a < 10: print(a) a+=1 b = a f(b) return a else: return a a = f(5) a等于6 a等于6 只执行一次 注意 怎么正确取值 ? def f(a): if a < 10: print(a) a+=1 b = f(a) f(b) return b else: return a 返回值是一个函数就可以啦 装饰器 : def outer(func): def inner(*arg, **kwargs): pr

python中RE正则匹配模块的用法若干

# -*- coding:utf-8 -*-import import reload()('utf-8')= [() for in ['this''that']]   # 编译一个匹配模板对象列表,该列表匹配模板编译源来自一个二元列表= 'Does this text match the pattern?'print 'Test:'' 'for in :                   # 查找每一个模板对象    print 'seeking "%s"-->' % if (

Python之正则re模块 --- findall()详解

1. findall() 函数的2种表示形式 1 import re 2 kk = re.compile(r'\d+') 3 kk.findall('one1two2three3four4') 4 #[1,2,3,4] 5 6 #注意此处findall()的用法,可传两个参数; 7 kk = re.compile(r'\d+') 8 re.findall(kk,"one123") 9 #[1,2,3] 2. 正则表达式可能遇到的坑  --- 正则表达式中的括号() 1. 当正则表达式中

re正则匹配模块_python

一.re模块 1.模块功能 通过re模块的接口接入正则表达式语言,主要用于匹配字符串. 2.正则表达式元字符以及意义 . 代表任意一个字符(除了换行符\n) ^ 以什么开头 $ 以什么结尾 * 重复匹配*前面的字符出现0到多次 [0,正无穷] + 重复匹配+前面的字符1到多次[1,正无穷] ? 重复匹配?前面的字符0或1次[0,1] {数字} 代表前面的匹配次数,如'b{3}' [] 代表字符集中的字符,或的关系,如'[a-z]',还有取消元字符意义的特殊功能, 如'[^123]',^放在[]里

python 正则re模块

re.match re.match 尝试从字符串的开始匹配一个模式,如:下面的例子匹配第一个单词. import re text = "JGood is a handsome boy, he is cool, clever, and so on..." m = re.match(r"(\w+)\s", text) if m: print m.group(0), '\n', m.group(1) else: print 'not match' re.match的函数原