Python--浅谈正则表达式与re模块

Python模块re提供了对正则表达式的支持,下面对re模块进行详细介绍

一、什么是正则表达式

正则表达式是可匹配文本片段的模式,最简单的正则表达式就是普通字符串,与它自己匹配。例如正则表达式‘PYTHON’与字符串‘PYTHON’相匹配。也可以使用多种正则表达式方法来匹配所需要的内容。

1、通配符

通配符是句点与除换行符以外的任何字符都能匹配。

例如:'.ython'与'python'和'jython'都能够匹配,与'dython'、'+ython'、'_ython'也都能匹配,但是与'cpython'、'ython'不匹配,因为句点只与一个字符匹配,而不与零或两个字符匹配

2、对特殊字符进行转义

有些特殊字符本身我们只是想作为字符串使用而不需要作为正则表达式的通配符进行使用,这个时候就需要转义(‘\’)

3、字符集

下面介绍一些常用的字符集匹配模式

第一:'[pj]yhton'与'python'和'jython'都能匹配,[pj]表示第一个字符是p或者是j都可以匹配

第二:'[a-z]'与a~z的任何字母都匹配,还可以组合多个访问,'[a-zA-Z0-9]'与大写字母、小写字母、数字都匹配

第三:要指定排除的字符集,可在开头添加一个^字符,例'[^abc]'与除a、b、c外的其他任何字符都匹配

4、二选一和子模式

4.1、二选一模式

如果只想匹配字符串'python'和'perl',必须使用表示二选一的特殊字符:管道字符'|',所需模式为'python|perl'

4.2、子模式

有时候不想将二选一运算符用于整个模式,而只想将其用于模式的一部分。为此,可将这部分(子模式)放在圆括号内,可以写成'p(ython|erl)'

5、可选模式与重复模式

通过在子模式后面加上问号,可将其指定为可选的,即可包含可不包含

例如:r'(http://)?(www\.)?python\.org'(使用原始字符串r'xxxxxx',可以减少所需的转义斜杠数量)

会出现以下匹配结果:

1、http://www.python.org

2、www.python.org

3、http://python.org

4、python.org

总结子模式匹配情况:

  • (pattern)?:表示pattern匹配模式可以出现0次或者1次
  • (pattern)*:表示pattern匹配模式可以出现0次、1次或多次
  • (pattern)+:表示pattern匹配模式可以出现1次或多次
  • (pattern){m,n}:表示pattern匹配模式可以重复m~n次

6、字符串的开头和末尾

字符串开头匹配用^,字符串末尾匹配则用$

二、模块re

re模块函数介绍

模块re中一些重要的函数
compile(pattern[,flags])  根据包含正则表达式的字符串创建模式对象,返回一个匹配模式的对象
search(pattern,string[,flags])  在字符串中查找第一个与指定正则表达式匹配的子串,匹配成功返回MacthObject(结果为真),否则返回None(结果为假)
match(pattern,string[,flags])

 在字符串开头查找与正则表达式匹配的子串,匹配成功返回MacthObject(结果为真),否则返回None(结果为假)

tips:如果要求与整个字符串匹配,需要在模式末尾加上一个$,将匹配模式延伸到整个字符串

split(pattern,string[,maxsplit=0])  根据匹配模式来分割字符串,比字符串split更加灵活
findall(pattern,string)  返回一个列表,其中包含所有与给定模式匹配的子串
sub(pat,repl,string[,flags])  将字符串中于模式pat匹配的子串都替换为repl(从左往右)
escape(string)  对字符串中所有可能被视为正则表达式运算符的字符进行转义

1、re.compile

import re

set_string='The sum of 7 and 9 is [7+9]'

pat=re.compile(r'\[(.+?)\]')

2、re.search

import re

set_string='The sum of 7 and 9 is [7+9]'
pat=re.compile(r'\[(.+?)\]')
s=re.search(pat,set_strint)
print(s)
-------------------------------------------------------------------------------------------
<_sre.SRE_Match object; span=(22, 27), match='[7+9]'>

3、re.match

import re

set_string='The sum of 7 and 9 is [7+9]'
pat=re.compile(r'\[(.+?)\]')
s=re.match(pat,set_strint)
print(s)
-------------------------------------------------------------------------------------------
None

4、re.split

import re

set_string='The sum of 7 and 9 is [7+9]'
pat=re.compile(r' ')
get_list=re.split(pat,set_string)
print(get_list)
-------------------------------------------------------------------------------------------
['The', 'sum', 'of', '7', 'and', '9', 'is', '[7+9]']

5、re.findall

import re

set_string='The sum of 7 and 9 is [7+9],and the sum of 9 and 9 is [9+9]'
pat=re.compile(r'\[(.+?)\]')
s=re.findall(pat,set_string)
print(s)
-------------------------------------------------------------------------------------------
['7+9', '9+9']

6、re.sub

import re

set_string='The sum of 7 and 9 is [7+9],and the sum of 9 and 9 is [9+9]'
pat=re.compile(r'\[(.+?)\]')
s=re.sub(pat,'result',set_string)
print(s)
-------------------------------------------------------------------------------------------
'The sum of 7 and 9 is result,and the sum of 9 and 9 is result'

7、re.escape

import re

set_string=r'https://www.python.org'
get_string=re.escape(set_string)
print(get_string)
-------------------------------------------------------------------------------------------
'https\:\/\/www\.python\.org'

三、匹配对象与编组

当我们查找与模式匹配的子串的函数都在找到时返回MatchObject对象,这种对象包含与模式匹配的子串的全部信息,还包含了模式的哪个部分与子串的哪部分匹配的信息,这些子串部分称为编组。

编组就是放在圆括号内的子模式,他们是根据左边的括号数编号的,其中编组0指的是整个模式,与jmeter的正则的编组规则相同。

import re

set_string=r'https://www.python.org'
pat=re.compile('(.+?)://(w+?)\.(.+?)\.(.+$)')
s=re.search(pat,set_string)
print(s.group(0))    #编组0
print(s.group(1))    #编组1
print(s.group(2))    #编组2
print(s.group(3))    #编组3
print(s.group(4))    #编组4
-------------------------------------------------------------------------------------------
'https://www.python.org'
'https'
'www'
'python'
'org'

通过上图可知,编组0是整个匹配字符串,编组1-4是匹配模式pat当中从左往右的圆括号内容,通过re.group(编组号码)可以得到我们想要得到的匹配信息。

下面介绍re匹配对象的函数

re匹配对象的重要方法
group([group1,...])  获取与给定子模式(编组)匹配的子串
start([group])  返回与给定编组匹配的子串的起始位置
end([group])  返回与给定编组匹配的子串的终止位置(与切片一样,不包含终止位置)
span([group])  返回与给定编组匹配的子串的起始和终止位置
import re

set_string=r'https://www.python.org'
pat=re.compile('(.+?)://(w+?)\.(.+?)\.(.+$)')
s=re.search(pat,set_string)
print(s.group(0,1,2,3,4))
print(s.start(1))
print(s.end(2))
print(s.span(3))
-------------------------------------------------------------------------------------------
('https://www.python.org', 'https', 'www', 'python', 'org')
0
11
(12, 18)

四、贪婪和非贪婪模式

1、贪婪模式

重复运算符默认是贪婪的,这意味着它们将匹配尽可能多的内容。

import re

set_string=r'*something**getlalala**wulalala*'
repl=r'<em>\1<\em>'
pat=re.compile('\*(.+)\*')
get_string=re.sub(pat,repl,set_string)
print(get_string)
-------------------------------------------------------------------------------------------
'<em>something**getlalala**wulalala<\em>'

通过上图可以看出,贪婪模式只会匹配并替换开头与结尾的字符串,尽可能多的匹配更多的内容,即能匹配多少就匹配多少。但如果我们是想把所有的*....*转换为<em>.....<\em>,则需要非贪婪模式。

2、非贪婪模式

对于所有的重复运算符,都可在后面加上问号来将其指定为非贪婪模式。匹配会尽可能少的内容。

import re

set_string=r'*something**getlalala**wulalala*'
repl=r'<em>\1<\em>'
pat=re.compile('\*(.+?)\*')
get_string=re.sub(pat,repl,set_string)
print(get_string)
-------------------------------------------------------------------------------------------
'<em>something<\em><em>getlalala<\em><em>wulalala<\em>'

猜你喜欢

转载自blog.csdn.net/BearStarX/article/details/82053211