python regex_python_regex

正则表达

动机(目的):

1、处理文本成为计算机主要工作之一

2、根据文本内容进行固定搜索是文本处理的常见工作

3、为了快速方便的处理上述问题,正则表达式技术诞生,逐渐发展为一种单独技术被众多语言使用

定义:即高级文本匹配模式,提供了搜索,代替等功能,本质是由一些字符和特殊符号组成的字串。这个字串描述了字符和字符的重复行为,可以匹配某些特征的字符串集合。

正则表达式的特点

1、方便进行检索和修改

2、支持众多语言

3、使用灵活变化多样

4、文本处理,mongo存储某一类型,django、tornado路由,爬虫文本匹配

正则的规则和用法:

import re

re.findall(regex,string)

1、功能:使用正则表达式匹配字符串

2、参数:regex:正则表达式,string目标字符串

3、返回值:匹配到的内容,一个列表

元字符:即正则表达式中含有特殊含义的字符

普通字符:

1、元字符:abc...

2、匹配规则:匹配相应的普通字符

3、示例:re.findall('ab','fdsfdsbdab')#['ab']

使用 或 多个正则同时匹配

1、元字符:|

2、匹配规则:符号两侧的正则均能匹配(符号两侧不要加空格)

3、示例:re.findall('ab|cd','fdcdsfcddsbabdab')#['cd', 'cd', 'ab', 'ab']

匹配单一字符

1、元字符:.

2、匹配规则:匹配任意一个字符 ‘\n’除外

3、示例:

1、re.findall('f.o','afdffoofds')#['ffo']

2、re.findall('f.o','afdff\noofds')#[],不能匹配\n

匹配字符串开头

1、元字符:^

2、匹配规则:匹配一个字符串的开头位置

3、示例:

1、re.findall('^hello','hello world')#['hello']

2、re.findall('^hello','ohello world')#[]

匹配字符串结尾

1、元字符:$

2、匹配规则:匹配一个字符串的结尾位置

3、示例:

1、re.findall('hello$','ohello hello')#['hello']

2、re.findall('hello$','ohello hellof')# []

匹配重复0次或多次

1、元字符:*

2、匹配规则:匹配前面出现的正则表达式0次或多次

2、示例:

1、re.findall('ab*','abcdaabbfdb')# ['ab', 'a', 'abb']

匹配重复1次或多次:

1、元字符:+

2、匹配规则:匹配前面正则表达式至少出现一次

3、示例:re.findall('ab+','abcdaabbfdb')#['ab', 'abb']

匹配重复0次或一次

1、元字符:?

2、匹配规则:匹配前面正则表达式0次或1次

3、示例:re.findall('ab?','abcdaabbfdb')#['ab', 'a', 'ab']

匹配重复指定次数

1、元字符:{N}

2、匹配规则:匹配前面的正则表达式N次

3、示例:re.findall('ab{2}','abcdaabbfdb')#['abb']

匹配重复指定参数范围

1、元字符:{N,M}

2、匹配规则:匹配前面正则表达式N次到M次(包括N和M)

3、示例:re.findall('ab{1,3}','abcdaabbfdb')# ['ab', 'abb']

字符集匹配:

1、元字符:[]

2、匹配规则:匹配中括号中的字符集,或者字符集区间的一个字符

3、示例:

1、[0-9]:匹配任意一个数字字符

2、[A-Z]:匹配任意一个大写字母

3、[a-z]:匹配任意一个小写字母

4、^[A-z][0-9a-z]{5}:匹配以大写字母开头,后面5位数字或小写字母

5、re.findall('^[A-Z][0-9a-z]{5}','Hello1 join')# ['Hello1']

5、[\u4e00-\u9fa5] :匹配任意一个中文

字符集不匹配:

1、元字符:[^...]

2、匹配规则:匹配出非字符集中任意一个字符

3、[^0-9]:匹配除了0-9的任意字符

匹配任意数字(非数字)字符:

1、元字符:\d等价于[0-9]        \D等价于[^0-9]

2、匹配规则:\d匹配任意一个数字字符 \D匹配任意非数字字符

3、示例:re.findall('1\d{10}','13333759329')#['13333759329']

匹配任意普字符或者特殊字符

1、元字符:\w [_0-9a-zA-z] \W[^_0-9a-zA-z]

2、匹配规则:\w匹数字字母下划线  \W匹配除了数字字母下划线的字符

3、示例:

1、re.findall('[A-z]\w*','Hello World')# ['Hello', 'World']

2、re.findall('[A-Za-z]+-\d+','wangming-56')#['wangming-56']

匹配任意空字符或非空字符:

1、元字符:\s  \S

2、匹配规则:\s任意空字符 [ \n\0\t\r]空格 换行 回车制表符   \S任意非空字符

3、示例:re.findall('hello\s+\w+\S','hello  lily hello lucy hellofdsf')#['hello  lily', 'hello lucy']

匹配字符串的开头和结尾:

1、元字符:\A等价于^   \Z等价于$

2、匹配规则:\A表示匹配字符串开头位置  \Z表示匹配字符串结尾位置

3、示例:re.findall('\Aabc\Z','abc')#['abc']严格匹配abc

匹配单词边界或非单词边界:

1、元字符:\b   \B

2、匹配规则:\b匹配一个单词的边界  \B匹配一个单词的非边界

3、说明:数字字母下划线和其他字符的交界处认为是单词的边界

4、示例:

1、re.findall('is','This is a test')# ['is', 'is']

2、re.findall(r'\bis\b','This is a test')#['is']匹配到后面的is(\b为退格有特殊含义所以要加r)

元字符总结:

1、匹配单个字符:. \d \D \w \W \s \S [...] [^...]

2、匹配重复次数:* + ? {N} {N,M}

3、匹配字符串位置:^ $ \A \Z \b \B

4、其他:|

r子串和转义(\)

r 将字符变为raw字符串,不进行字符串的转义

示例:re.findall('\\bis\\b','This is a test')等价于re.findall(r'\bis\b','This is a test')

贪婪和非贪婪:

1、和重复次数不确定的元字符相关:* + ? {N,M}

2、贪婪模式:在使用重复元字符的时候,元字符的匹配总是尽可能多的向后匹配更多的内容,贪婪模式为默认模式

示例:re.findall('ab*','abbbbbbbbgab')#['abbbbbbbb', 'ab']尽可能多的匹配b

3、非贪婪模式:尽可能少的匹配内容,只要满足正则条件即可

示例:re.findall('ab*?','abbbbbbbbgab')# ['a', 'a']尽可能少的匹配b

importre

str= 'Hello 1234567 World_This is a Regex Demo'res= re.match(r'^He.*(\d+)',str)print(res.group(1))#(\d+)匹配到的是7,.*平匹配到的是llo 123456

res2 = re.match(r'^He.*?(\d+)',str)print(res2.group(1))#(\d+)匹配到的是1234567,.*?匹配到的是llo ,

正则表达式的分组:

1、使用()为正则表达式分组

2、(ab):表示给ab分了一个子组

3、正则表达式的子组用()表示,增加子组后对整体的匹配没有影响

4、每个正则表达式可以有多个子组,子组由外到内由左到右为第一第二第三......子组

5、子组表示一个内部整体,很多函数可以单独提取子组的值

6、子组可以改变重复行为,将子组作为整体重复

示例:re.match('(ab)+','ababfhdsabdfbsf').group(0)#'abab'

7、捕获组和非捕获组(命名组和非命名组)

1、格式:(?Pregex)

2、作用:

1、某些函数可以通过名字提取子组内容,或者通过名字进行键值对的生成

2、起了名字的子组可以通过名称重复使用

示例:res = re.match('(?Pab)cd(?P=str)','abcdab').group()# 'abcdab'

说明:上面的正则相当于是一个子组即res.group(0)#'abcdab',res.group(1)# 'ab',res.group(2)#报错

与这样的匹配是不同的:res = re.match('(ab)cd(ab)','abcdab') ;res.group(0)#'abcdab',res.group(1)# 'ab',res.group(2)#'ab'

练习:

1、匹配长度为8-10为的密码,必须以字母开头,数字字母下划线组成

re.findall(r'^[a-zA-z]\w{7,9}$','xfjsdjfk56')

2、匹配身份证号

re.findall(r'\d{17}[x\d]','410422199212202556')

re模块

1、complie(pattern, flags=0)

1、功能:获取正则表达式对象

2、参数:

1、pattern:正则表达式

2、flags:功能标志位,提供正则表达式结果的辅助功能

3、返回值:返回相应的正则对象

4、说明:

1、compile函数返回值的属性函数和re模块属性函数有相同的部分

2、他们的功能完全相同

3、compile返回值对象属性函数中pattern和flags部分,因为这两个参数内容在compile生成对象时已经指明而re模块直接调用这些函数时则需要传入,

4、compile返回值对象属性函数参数中有pos和endpos参数,可以指明匹配目标字符串的起始和终止位置,而re模块直接调用这些函数时没有这个

2、findall(string,pos ,endpos)

1、功能:将正则表达式匹配到的内容存入列表返回

2、参数:要匹配的目标字符串

3、返回值:返回匹配到内容的列表,如果正则表达式中有子组则返回子组元组的列表

3、spilt(regex,string):

1、功能:以正则表达式切割字符串

2、参数

3、返回值:分割后的内容放入列表

4、sub()

1、功能:用替换字符串替换正则表达式匹配到的内容

2、参数

3、返回值:返回替换后的字符串

5、subn():

1、功能:同sub

2、参数:同sub

3、返回值:返回一个元组,元组中第一个元素为替换后的字符串,第二个为替换的次数

6、groupindex:compile对象属性,得到由捕获组名和第几个子组数字组成的字典

7、groups:compile对象属性,得到一共有多少个子组

importre

pattern= r'((?Pab)cd(ef))'

#创建正则表达式对象

obj =re.compile(pattern)

l= obj.findall('abcdefghinabcdef')print(l)

l1= re.split(r'\s+','hello world nihao china')print(l1)

s= re.sub(r'[A-Z]','##','Hello World',1)#不给最后一个参数默认全部替换

print(s)###ello World

s2= re.subn(r'[A-Z]','##','Hello World',1)print(s2)#('##ello World', 1)

print(obj.groupindex)#{'word': 2}

print(obj.groups)#3

View Code

8、finditer()

1、功能:同findall查找所有正则匹配到的内容

2、参数:同findall

3、返回值:返回一个迭代器,迭代的每一项都是一个matchobj

9、match()

1、功能:匹配一个字符串开头的位置

2、参数:目标字符串

3、返回值:如果匹配到返回一个matchobj,如果没有匹配到返回None

10、search()

1、功能:同match,只是可以匹配到任意位置,只能匹配一处

2、参数:目标字符串

3、返回值:如果匹配到返回一个matchobj,如果没有匹配到返回None

11、fullmatch()

1、功能:完全匹配,整个目标字符串完全由正则pp

2、参数:目标字符串

3、返回值:如果匹配到返回一个matchobj,如果没有匹配到返回None

importre

obj= re.compile(r'foo')

iter_obj= obj.finditer('fdfoo,food the')for i initer_obj:print(i.group())print('**************')#match匹配开头

try:

m_obj= obj.match('qfoo,food on the jfdksf')print(m_obj.group())exceptAttributeError:print('match none')#search匹配任意位置

try:

m_obj= obj.search('qfoo,food on the jfdksf')print(m_obj.group())exceptAttributeError:print('match none')

View Code

12、match对象属性及函数

1、属性

1、re

2、pos

3、endpos

4、lastgroup

5、lastindex

2、方法:

1、start()

2、end()

3、span()

4、group()

1、功能:获取match对象匹配的内容

2、参数:默认为0表示整体匹配内容,>=1表示获取某个子组的匹配内容

3、返回值:返回对应的内容

5、groups()

6、groupdict()

importre

re_obj= re.compile('(ab)cd(?Pef)')

match_obj= re_obj.search('hi ,fkdfkabcdeffdk')#match对象属性

print('re:',match_obj.re)#re.compile('(ab)cd(?Pef)')

print('pos:',match_obj.pos)#0,匹配目标字符串的开始位置

print('endpos:',match_obj.endpos)#18,匹配目标字符串的终止位置+1

print('lastgroup:',match_obj.lastgroup)#dog,最后一个分组的名称,最后一个分组如果没有名称则返回NOne

print('lastindex:',match_obj.lastindex)#2,分组的个数(最后一组是第几组)

print('**********************************')#match属性的函数

print('start():',match_obj.start())#9获取匹配内容在字符串中的开始位置

print('end():',match_obj.end())#15,获取匹配内容在字符串中结束的位置+1

print('span():',match_obj.span())#(9, 15),获取匹配内容在字符串中的起止位置

print('group():',match_obj.group())#abcdef,获取match对象匹配的内容,默认为0表示整体匹配内容,

print('group():',match_obj.group(1))#ab,>=1表示获取某个子组的匹配内容

print('group():',match_obj.group(2))#ef

print('groups():',match_obj.groups())#('ab', 'ef'),获取所有子组中的内容

print('groupdict():',match_obj.groupdict())#{'dog': 'ef'},返回所有捕获组构成的字典,如过没有捕获组返回字典,名字为键

View Code

flags:re直接调用的匹配函数大多有flags参数。功能为辅助正则匹配的标志位

1、I(IGNORECASE):忽略大小写

2、S(DOTALL):匹配换行对.元字符起作用

3、M(MULTILINE):开头结尾计算换行 对^ $起作用,对\A \Z不起作用

4、X(VERBOSE):让正则能以#添加注释

说明:同时可以添加多个flags,比如:re.I|re.S

importre

re_object= re.compile('abcD',re.I)

l= re_object.findall('himabcd,ADABCDf')print(l)#['abcd', 'ABCD']

s= '''hello world\nnihao china'''l1= re.findall('.+',s,re.S)print(l1)#['hello world\nnihao china']#^ $匹配每一行的开头结尾

obj = re.search('^nihao',s,re.M)print(obj.group())#nihao

obj= re.search('world$',s,re.M)print(obj.group())#world

re_obj= re.compile('''(ab)#这是第一个分组\ncd\n(?Pef)#这是第二个分组''',re.X)print(re_obj.search('abcdefgh').group())#abcdef

View Code

当你使用这段代码时,你需要先定义正则表达式的模式,并将其存储在`regex_data`变量中。这个变量可以存储一个字符串或者一个正则表达式对象。例如,如果你想匹配一个字符串中的所有数字,你可以这样定义`regex_data`变量: ``` import re regex_data = r'\d+' text = 'Today is 2021-06-15, and it is a sunny day.' matches = re.findall(regex_data, text) print(matches) ``` 这段代码中,`regex_data`存储的是一个正则表达式字符串`r'\d+'`,它表示匹配一个或多个数字。然后,我们使用Python的正则表达式模块`re`对字符串`text`进行匹配,将匹配结果存储在`matches`变量中。最后,我们打印出匹配结果,输出为`['2021', '06', '15']`。 另一个实例,如果你想匹配一个HTML标签中的所有属性名和属性值,你可以这样定义`regex_data`变量: ``` import re regex_data = r'\s+(\w+)\s*=\s*(?:"([^"]*)"|\'([^\']*)\'|([^\s>]+))' text = '<div class="container" id=\'main\' custom-attr="123">Hello, world!</div>' matches = re.findall(regex_data, text) print(matches) ``` 这段代码中,`regex_data`存储的是一个正则表达式字符串,它可以匹配HTML标签中的所有属性名和属性值。然后,我们使用Python的正则表达式模块`re`对字符串`text`进行匹配,将匹配结果存储在`matches`变量中。最后,我们打印出匹配结果,输出为`[('class', 'container', '', ''), ('id', '', 'main', ''), ('custom-attr', '', '', '123')]`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值