正则表达式
<p>1、正则表达式:是一个记录文本规则的代码,是一个特殊的字符序列,由普通字符和元组组成,其实就是对元组字符的学习。</p>
<p>2、行定位符</p>
<pre><code>^:行的开始
$:行的结尾
案例
^ab
说明:要匹配的字符串ab的开始位置是行头,可以匹配:ab cdefg hijk
ab$
说明:要匹配的字符串ab的开始位置是行尾,可以匹配:cdefg hijk ab
ab
说明:要匹配的字符串ab可以是任意位置,可以匹配:cdeab hijk ab ab shkhg ab</code></pre>
<p>3、元字符</p>
<pre><code>说明:字母都是小写的,括号在正则表达式中也算是一个元字符。
.
匹配除换行符以外的任意字符
\w
匹配字母、数字、下划线、汉字
\s
匹配任意的空格符
\d
匹配数字
\b
匹配单词的开始或结束
^
匹配字符串的开始
$
匹配字符串的结束</code></pre>
<p>3、反义代码</p>
<pre><code>说明:字母都是大写的,使用方法与“元字符”一样,意思相反。
. 匹配除换行符以外的任意字符
\W 匹配任意不是字母或数字或下划线或汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配非数字
\B 匹配不是单词的开始或结束的位置
[^a] 匹配除了a以外的所有字符</code></pre>
<p>4、限定符</p>
<pre><code>?
匹配前面的字符0次或1次,举例:colou?r,表示可以匹配colour和color。
+
匹配前面的字符1次或多次,举例:go+gle,表示可以匹配的范围从gogle到goo...gle。
*
匹配前面的字符0次或多次,举例:go*gle,表示可以匹配的范围从ggle到goo...gle。
{n}
匹配前面的字符n次,举例:go{2}gle,表示只匹配google。
{n,}
匹配前面的字符最少n次,举例:go{2,}gle,表示可以匹配的范围从gogle到goo...gle。
{n,m}
匹配前面的字符最少n次最多m次,举例:employe{0,2},表示可以匹配employ和employe和employee这3种情况。
案例
匹配8位QQ号:^\d{8}$</code></pre>
<p>5、字符类</p>
<pre><code>说明
只需要在[]中列出要匹配的字符即可。
案例
[aeiou]说明:匹配任何一个元音字母。
[.?!]说明:匹配标点负号.或?或!。
[0-9]说明:匹配数字,等同于\d。
[a-z0-9A-Z]说明:匹配字母或数字。
[\u4e00-\u9fa5]说明:匹配任意一个汉字。
[\u4e00-\u9fa5]+说明:匹配连续多个汉字。</code></pre>
<p>6、排除字符</p>
<pre><code>^
放在[]中表示排除的意思。
案例
[^a-zA-A] 说明:匹配一个不是字母的字符。</code></pre>
<p>7、选择字符</p>
<pre><code>| 说明:是选择字符,可以理解为"或"。
案例
匹配身份证号码:匹配15位数字、18位数字、或17位数字和最后一位(最后一位可以是数字、X、x)
^\d{15}$|(^\d{18}$)|(^\d{17}(\d|x|X))$</code></pre>
<p>8、转义字符</p>
<pre><code>\
续行符,将字符串当中的具有特殊含义的字符的特殊含义取消掉。
\n
换行符。
\t
水平制表符,tab键、空格,用于横向跳到下一位制表位。
\0
空
\"
双引号
\'
单引号
\\
一个反斜杠
\f
换页
\0dd
八进制数,dd表示字符,如\012代表换行
\xhh
十六进制数,hh表示字符,如\0a代表换行
案例
匹配例如127.0.0.1这样的IP
[1-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[1-9]{0,3}</code></pre>
<p>9、分组</p>
<pre><code>表达式
(one|two)th 说明:匹配单词one或two,不带括号表示one和twoth。</code></pre>
<p>10、正则表达式语法</p>
<pre><code>说明
由于模式字符串中可能存在包括大量的特殊字符和反斜杠,所以需要写为原生字符串,即模式字符串前加r或R。
模式字符串
匹配不是字母的一个字符
[^a-zA-Z]
匹配以字母m开头的字符
\\bm\\w*\\b
原生字符串
匹配以字母m开头的字符
r'\bm\w*\b'</code></pre>
<p>11、使用re实现正则表达式操作</p>
<p>11.1、匹配字符串</p>
<p>(1)使用match()方法进行匹配</p>
<pre><code>说明
用于从字符串的开始处进行匹配,如果在起始位置匹配成功,则返回Match对象,否则返回None。
语法格式
re.match(pattern,string,[flags])
参数说明:
pattern:模式字符串,由要匹配的正则表达式转换而来。
string:要匹配的字符串。
flags:可选参数,表示标志位,用于控制匹配方式,常用标志如下。
案例
匹配第一个以"mr_"开头的字符串,不区分大小写。
import re
pattern = r'mr_\w+' 模式字符串
string = 'MR_SHOP mr_shop' 要匹配的字符串
match = re.match(pattern,string,re.I) 匹配字符串,不区分大小写
print('匹配值的起始位置:',match.start()) 0
print('匹配值的结束位置:',match.end()) 7
print('匹配位置的元组:',match.span()) (0,7)
print('要匹配的字符串:',match.string()) MR_SHOP mr_shop
print('匹配数据:',match.group()) MR_SHOP
string = '项目名称 MR_SHOP mr_shop'
match = re.match(pattern,string,re.I)
print(match)
输出:
<re.Match object; span=(0, 7), match='MR_SHOP'>
None</code></pre>
<p>(2)使用search()方法进行匹配</p>
<pre><code>说明
只匹配第1个,用于在整个字符串中搜索第一个匹配的值,如果在起始位置匹配成功,则返回Match对象,否则返回None。
注:search()方法不仅在字符串的起始位置搜索,其他位置有符合的匹配也可以。
语法格式
re.search(pattern,string,[flags])
参数说明:
pattern:模式字符串,由要匹配的正则表达式转换而来。
string:要匹配的字符串。
flags:可选参数,表示标志位,用于控制匹配方式,常用标志如下。
案例
匹配第一个以"mr_"开头的字符串,不区分大小写
import re
pattern = r'mr_\w+'
string = 'MR_SHOP mr_shop'
match = re.search(pattern,string,re.I)
print(match)
string = '项目名称 MR_SHOP mr_shop'
match = re.search(pattern,string,re.I)
print(match)
输出:
<re.Match object; span=(0, 7), match='MR_SHOP'>
<re.Match object; span=(5, 12), match='MR_SHOP'></code></pre>
<p>(3)使用findall()方法进行匹配</p>
<pre><code>说明
匹配所有,用于在整个字符串中搜索所有符合正则表达式的字符串,并以列表的形式返回。
如果匹配成功则返回包含匹配结构的列表,否则返回空列表。
语法格式:
re.findall(pattern,string,[flags])
参数说明:
pattern:模式字符串,由要匹配的正则表达式转换而来。
string:要匹配的字符串。
flags:可选参数,表示标志位,用于控制匹配方式,常用标志如下。
案例
匹配搜索以"mr_"开头的字符串
import re
pattern = r'mr_\w+'
string = 'MR_SHOP mr_shop'
match = re.findall(pattern,string,re.I)
print(match)
string = '项目名称 MR_SHOP mr_shop'
match = re.findall(pattern,string,re.I)
print(match)
输出:
['MR_SHOP', 'mr_shop']
['MR_SHOP', 'mr_shop']
案例
如果在指定的模式字符串中包含分组,则返回与分组匹配的文本列表。
import re
pattern = r'([1-9]{1,3}(\.[0-9]{1.3}){3})'
str1 = '127.0.0.1 192.168.1.66'
match = re.findall(pattern,str1)
for i in match:
print(i[0])
输出:
127.0.0.1
192.168.1.66
常用标志
A或ASCII
对\w、\W、\b、\B、\d、\D、\s、\S只进行ASCII匹配(仅适用于python3)
I或IGNORECASE
执行不区分字母大小写的匹配
M或MULTILNE
将^和$用于包括整个字符串的开始和结尾的每一行(默认情况下,仅适用于整个字符串的开始和结尾处)
S或DOTALL
使用"."字符匹配所有字符,包括换行符
X或VERBOSE
忽略模式字符串中未转义的空格和注释</code></pre>
<p>11.2、替换字符串</p>
<pre><code>说明
sub(方法用于实现字符串的替换)
语法格式
re.sub(pattern,repl,string,count,flags)
参数说明:
pattern:模式字符串,有=由要匹配的正则表达式转换而来。
repl:替换的字符串。
string:要被查找替换的原始字符串。
count:可选参数,表示模式匹配后替换的最大次数,默认值为0,表示替换所有匹配。
flags:可选参数,表示标志位,用于控制匹配方式,常用标志如下。
案例
隐藏中奖信息中的手机号。
import re
pattern = r'1[34578]\d{9}'
string = '中奖号码为:84978881 联系电话为:13611111111'
result = re.sub(pattern,'1xxxxxxxxxx',string)
print(result)
输出:
中奖号码为:84978881 联系电话为:1xxxxxxxxxx</code></pre>
<p>11.3、使用正则表达式分割字符串</p>
<pre><code>说明
split()方法用于实现字符串的分割,并以列表的形式返回。
语法格式
re.split(pattern,string,[maxsplit],[flags])
参数说明:
pattern:模式字符串,由要匹配的正则表达式转换而来。
string:要匹配的字符串。
maxsplit:可选参数,最大的拆分次数。
flags:可选参数,表示标志位,用于控制匹配方式,常用标志如下。
案例
从给定的URL中提取出请求地址和哥哥参数
import re
pattern = r'[?|&]' 定义分隔符
url = 'http://www.mingrisoft.com/login.jsp?username="mr"&pwd="mrsoft"'
result = re.split(pattern,url)
print(result)
输出:
['http://www.mingrisoft.com/login.jsp', 'username="mr"', 'pwd="mrsoft"']</code></pre>