Python的正则表达式(re库)详解(完整版)

正则表达式详解

正则表达式,英文名称叫Regular Expression,简称RegEx,是用来匹配字符的一种工具,它常被用在网页爬虫、文稿整理、数据筛选等方面,最常用的就是用在网页爬虫,数据抓取。掌握正则表达式能够达到事半功倍的效果。

match:必须从字符串的开头匹配
 - 语法:re.match(pattern, string, flags=0)
 - 解释:pattern:表示模式字符串,由要匹配的正则表达式转换而来。
        string:表示要匹配的字符串。
        flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。

search:从任意位置查找第一个匹配的内容
 - 语法:re.search(pattern, string, flags=0)
 - 解释:pattern:表示模式字符串,由要匹配的正则表达式转换而来。
        string:表示要匹配的字符串。
        flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。

findall:查找整个字符串,返回一个list
 - 语法:re.findall(pattern, string, flags=0)
 - 解释:pattern:表示模式字符串,由要匹配的正则表达式转换而来。
        string:表示要匹配的字符串。
        flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。

sub:查找字符串中所有匹配的数据进行替换
 - 语法:re.sub(pattern, repl, string[,count=0][,flags=0])
 - 解释:pattern:表示模式字符串,由要匹配的正则表达式转换而来。
        repl:表示替换的字符串。
        string:表示要匹配的字符串。
        count:可选参数,表示模式匹配后替换的最大次数,默认值为0,表示替换所有的匹配值。
        flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。

split:对字符串进行分割,返回一个list
 - 语法:re.split(pattern, string[,maxsplit=0][,flags=0])
 - 解释:pattern:表示模式字符串,由要匹配的正则表达式转换而来。
        string:表示要匹配的字符串。
        maxsplit:可选参数,表示最大的拆分次数。
        flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。

compile:编译正则表达式,生成一个pattern对象,供 match() 和 search() 使用。
 - 语法:def compile(pattern, [flags=0])

Match对象的属性:
re:匹配时,使用的pattern对象
pos:正则表达式搜索文本的开始位置
endpos:正则表达式搜索文本的结束位置
string:要匹配的字符串

Match对象的方法:
start():返回匹配值的起始位置
end():返回匹配值的结束位置
span():返回一个元组包含匹配(开始,结束)的位置
group(num=0):返回整个的匹配对象,或特殊编号的字组
groups(default =None):返回一个含有所有匹配子组的元组,匹配失败则返回空元组

re模块中flags的常用属性:
标志位,用于控制正则表达式的匹配方式。
- re.I:忽略大小写
- re.L:表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
- re.M:多行模式
- re.S:即为 . ,并且包括换行符在内的任意字符(.不包括换行符)
- re.U:表示特殊字符集 \w, \W, \b, \B, \s, \S, \d, \D 依赖于 Unicode 字符属性数据库
- re.X:为了增加可读性,忽略空格和 # 后面的注释

标识符“r”的作用:

r:Python中,字符串的前导“r”代表原始字符串标识符,该字符串中的特殊符号不会被转义,适用于正则表达式中繁杂的特殊符号表示。 因此 r'\n' 表示包含 '\' 和 'n' 两个字符的字符串,而 '\n' 则表示只包含一个换行符的字符串。

转义字符

表达式可匹配表达式可匹配
\n匹配换行符\?匹配 ? 符号本身
\t匹配制表符\*匹配 * 符号本身
\\匹配 \ 符号本身\+匹配 + 符号本身
\^匹配 ^ 符号本身+{、\}匹配大括号
\$匹配 $ 符号本身\[、\]匹配中括号
\.匹配小数点本身\(、\)匹配小括号

匹配单个字符

字符功能位置
.匹配任意1个字符(除\n外)
[ ]匹配[ ]中列举的字符

[abc]:匹配abc中的任意一个字符

[^abc]:匹配abc之外的任意一个字符

[a-g]:匹配a~g之间的任意一个字母

[^a-g0-5]:匹配a~g,0~5之外的任意一个字符

\d匹配数字,即0-9可以写在字符集[...]中
\D匹配⾮数字,即不是数字可以写在字符集[...]中
\s匹配空⽩,即空格、tab键可以写在字符集[...]中
\S匹配⾮空⽩字符可以写在字符集[...]中
\w匹配单词字符,即a-z、A-Z、0-9、_可以写在字符集[...]中
\W匹配⾮单词字符可以写在字符集[...]中
\w\w 匹配单词字符,即a-z、A-Z、0-9、_
\W匹配⾮单词字符

字符集[...],对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出,也可以给出范围,比如[abc]和[a-c],第一个字符如果是^表示取反。所有特殊字符(比如"]""-""^")在字符集中都失去原来的含义,如要使用可把"]""-"放在第一个字符,"^"放在非第一个字符。

匹配多个字符

字符功能表达式实例完整匹配的字符串
*

表达式不出现或出现任意次,相当于{0,}

abc*abccc
+表达式⾄少出现1次,相当于{1,}abc+abccc
?表达式出现0次或1次,相当于{0,1}abc?ab,abc
{m,}表达式至少重复m次ab{1,}cabbc
{m,n}

表达式至少重复m次,最多重复n次

ab{1,2}cabc,abbc
{n}表达式重复n次ab{2}cabbc

抽象意义的特殊符号

字符功能
^匹配字符串开头,在 [ ] 中表示 ‘‘非’’(!)
$匹配字符串结尾,在 \n 之前
|匹配左右任意⼀个表达式
(ab)将括号中字符作为⼀个分组
\num引⽤分组num匹配到的字符串
(?P<name>)分组起别名,匹配到的子串组在外部是通过定义的 name 来获取的
(?P=name)引⽤别名为name分组匹配到的字符串

贪婪与非贪婪

在使用修饰匹配次数的特殊符号时,如“?”,“*”, “+”等,可以使同一个表达式能够匹配不同的次数,具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配,这种匹配原则就叫作"贪婪" 模式 。例如,针对文本“dxxxdxxxd”,下列表达式匹配结果如下:

表达式可匹配
(d)(\w+)"w+"将匹配第一个"d"之后的所有字符"xxxdxxxd"
(d)(\w+)(d)\w+"将匹配第一个"d"和最后一个"d"之间的所有字符xxxdxxx"。虽然"\w+"也能够匹配上最后一个"d",但是为了使整个表达式匹配成功,"\w+"可以"让出"它本来能够匹配的最后一个"d"

在修饰匹配次数的特殊符号后再加上一个"?" 号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的 “不匹配”。这种匹配原则叫作"非贪婪" 模式。如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配成功。例如,针对文本“dxxxdxxxd”,下列表达式匹配结果如下:

表达式可匹配
(d)(\w+?)"\w+?"将尽可能少的匹配第一个"d"之后的字符,结果是:"\w+?"只匹配了一个"x"
(d)(\w+?)(d)为了让整个表达式匹配成功,"w+?"不得不匹配"xxx才可以让后边的"d"匹配,从而使整个表达式匹配成功。因此,结果是:"\w+?"匹配“xxx"

常见的正则表达式

校验字符的表达式

★ 汉字:^[\u4e00-\u9fa5]{0,}$
★ 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
★ 长度为3-20的所有字符:^.{3,20}$
★ 由26个英文字母组成的字符串:^[A-Za-z]+$
★ 由26个大写英文字母组成的字符串:^[A-Z]+$
★ 由26个小写英文字母组成的字符串:^[a-z]+$
★ 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
★ 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$
★ 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$
★ 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
★ 可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+
★ 禁止输入含有~的字符:[^~\x22]+

校验数字的表达式

★ 数字:^[0-9]*$
★ n位的数字:^\d{n}$
★ 至少n位的数字:^\d{n,}$
★ m-n位的数字:^\d{m,n}$
★ 零和非零开头的数字:^(0|[1-9][0-9]*)$
★ 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$
★ 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$
★ 正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$
★ 有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
★ 有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
★ 非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
★ 非零的负整数:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$
★ 非负整数:^\d+$ 或 ^[1-9]\d*|0$
★ 非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
★ 非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
★ 非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
★ 正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
★ 负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
★ 浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

特殊需求表达式

★ Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
★ 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
★ InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
★ 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
★ 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
★ 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
★ 身份证号(15位、18位数字):^\d{15}|\d{18}$
★ 短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
★ 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
★ 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
★ 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
★ 日期格式:^\d{4}-\d{1,2}-\d{1,2}
★ 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
★ 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
★ 钱的输入格式:
  - 1.有四种钱的表示形式我们可以接受:"10000.00"和"10,000.00",和没有"分"的"10000"和"10,000":^[1-9][0-9]*$
  - 2.这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$
  - 3.一个0或者一个不以0开头的数字,我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$
  - 4.这表示一个0或者一个可能为负的开头不为0的数字,让用户以0开头好了,把负号的也去掉,因为钱总不能是负的吧,下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$
  - 5.必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是"10"和"10.2"是通过的:^[0-9]+(.[0-9]{2})?$
  - 6.这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$
  - 7.这样就允许用户只写一位小数,下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
  - 8.1到3个数字,后面跟着任意个逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
  - 备注:这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)。最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里
★ xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
★ 中文字符的正则表达式:[\u4e00-\u9fa5]
★ 双字节字符:[^\x00-\xff](包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
★ 空白行的正则表达式:\n\s*\r(可以用来删除空白行)
★ HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? />(网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)
★ 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$)(可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
★ 腾讯QQ号:[1-9][0-9]{4,}(腾讯QQ号从10000开始)
★ 中国邮政编码:[1-9]\d{5}(?!\d)(中国邮政编码为6位数字)
★ IP地址:\d+\.\d+\.\d+\.\d+(提取IP地址时有用)
★ IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值