python正则表达式
正则表达式是一个独特的标识符编码序列,它能协助你便捷的查验一个字符串数组是不是与某类模式匹配。python内嵌re模块专业用于解决正则表达式。
re模块基本使用方法
re.search(pattern, string, flags=0) # 主要参数表明跟上面一样
re.match只配对字符串数组的逐渐,假如字符串数组逐渐不符正则表达式,则配对不成功,涵数回到None;而re.search配对全部字符串数组,直至寻找一个配对
re.match涵数
e.match 试着从字符串数组的起止部位配对一个方式,要不是起止部位配对取得成功得话,match()就回到none
re.match(pattern, string, flags=0) # pattern配对的正则表达式,string要配对的字符串数组,flags标志位,用以操纵正则表达式的配对方法,如:是不是区别英文大小写,几行配对这些
举例说明:
import re
print(re.match('www', 'www.h3blog.com').span()) # 在起止部位配对
> (0, 3)
print(re.match('com', 'www.h3blog.com')) # 没有起止部位配对
> None
m = re.match( '(.*) h3blog (.*) ', 'www.h3blog.com', re.M|re.I)
print(m.groups())
> ('www.', '.com!')
print(m.group())
> www.h3blog.com
print(m.group(1))
> www.
print(m.group(2))
> .com
re.search涵数
re.search 扫描仪全部字符串数组并回到第一个取得成功的配对
re.search(pattern, string, flags=0) # pattern配对的正则表达式,string要配对的字符串数组,flags标志位,用以操纵正则表达式的配对方法,如:是不是区别英文大小写,几行配对这些
举例说明:
import re
print(re.search('www','www.h3blog.com').span()) # 从起止部位配对
> (0, 3)
print(re.search('com','www.h3blog.com').span()) # 没有起止部位配对
> (11, 14)
m = re.search('(.*) h3blog (.*) ', 'www.h3blog.com', re.M|re.I)
print(m.groups())
> ('www.', '.com!')
print(m.group())
> www.h3blog.com
print(m.group(1))
> www.
print(m.group(2))
> .com
re.match与re.search的差别
re.match只配对字符串数组的逐渐,假如字符串数组逐渐不符正则表达式,则配对不成功,涵数回到None;而re.search配对全部字符串数组,直至寻找一个配对
查找与更换
re 控制模块出示了re.sub用以更换字符串数组中的配对项
re.sub(pattern, repl, string, count=0, flags=0) # pattern正则表达式中的方式字符串数组,repl更换的字符串数组,也能为一个涵数,string要被查找替换的初始字符串数组,count模式匹配后更换的较大 频次,默认设置 0 表明更换全部的配对
举例说明:
import re
phone = "2004-959-559 # 这是一个海外联系电话"
# 删掉字符串数组中的 Python注解
num = re.sub('#.*$', '', phone)
print( '联系电话是: ', num)
> 联系电话是: 2004-959-559
# 删掉非数据(-)的字符串数组
num = re.sub('\D', "", phone)
print('联系电话是 : ', num)
> 联系电话是: 2004959559
# repl设成涵数
# 将配对的数据乘于 2
def double(matched):
value = int(matched.group('value'))
return str(value * 2)
s = 'A23G4HFD567'
print(re.sub('(?P<value>\d )', double, s))
> A48G8HFD1134
re.compile 涵数
compile 涵数用以编译程序正则表达式,转化成一个正则表达式( Pattern )目标,供 match() 和 search() 这两个涵数应用
re.compile(pattern[, flags])
# pattern 一个字符串数组方式的正则表达式,
# flags可选择,表明模式匹配,例如忽视英文大小写,几行方式等
flags 实际能够是:
- re.I 忽视英文大小写
- re.L 表明独特字段名 \w, \W, \b, \B, \s, \S 取决于当今自然环境
- re.M 几行方式
- re.S 即是 . 而且包含换行符以内的随意标识符(. 不包括换行符)
- re.U 表明独特字段名 \w, \W, \b, \B, \d, \D, \s, \S 取决于 Unicode 标识符特性数据库查询
- re.X 为了更好地提升易读性,忽视空格符和 # 后边的注解
>>>import re
>>> pattern = re.compile(r'\d ') # 用以配对最少一个数据
>>> m = pattern.match('one12twothree34four') # 搜索头顶部,沒有配对
>>> print m
None
>>> m = pattern.match('one12twothree34four', 2, 10) # 从'e'的部位逐渐配对,沒有配对
>>> print m
None
>>> m = pattern.match('one12twothree34four', 3, 10) # 从'1'的部位逐渐配对,恰好配对
>>> print m # 回到一个 Match 目标
<_sre.SRE_Match object at 0x10a42aac0>
>>> m.group(0) # 可省去 0
'12'
>>> m.start(0) # 可省去 0
3
>>> m.end(0) # 可省去 0
5
>>> m.span(0) # 可省去 0
(3, 5)
在上面,当配对取得成功时回到一个 Match 目标,在其中:
- group([group1, …]) 方式用以得到一个或好几个排序配对的字符串数组,若想得到全部配对的子串时,可立即应用 group() 或 group(0)
- start([group]) 方式用以获得排序配对的子串在全部字符串数组中的起止部位(子串第一个标识符的数据库索引),主要参数初始值为 0
- end([group]) 方式用以获得排序配对的子串在全部字符串数组中的完毕部位(子串最终一个字符的数据库索引 1),主要参数初始值为 0
- span([group]) 方式回到 (start(group), end(group))
举例说明:
>>>import re
>>> pattern = re.compile(r'([a-z] ) ([a-z] )', re.I) # re.I 表明忽视英文大小写
>>> m = pattern.match('Hello World Wide Web')
>>> print m # 配对取得成功,回到一个 Match 目标
<_sre.SRE_Match object at 0x10bea83e8>
>>> m.group(0) # 回到配对取得成功的全部子串
'Hello World'
>>> m.span(0) # 回到配对取得成功的全部子串的数据库索引
(0, 11)
>>> m.group(1) # 回到第一个排序配对取得成功的子串
'Hello'
>>> m.span(1) # 回到第一个排序配对取得成功的子串的数据库索引
(0, 5)
>>> m.group(2) # 回到第二个排序配对取得成功的子串
'World'
>>> m.span(2) # 回到第二个排序配对取得成功的子串
(6, 11)
>>> m.groups() # 等额的于 (m.group(1), m.group(2), ...)
('Hello', 'World')
>>> m.group(3) # 不会有第三个排序
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: no such group
findall方式
在字符串数组中寻找正则表达式所配对的全部子串,并回到一个目录,要是没有寻找配对的,则回到空目录。
留意: match 和 search 是配对一次 findall 配对全部。
findall(string[, pos[, endpos]]) # string 待配对的字符串数组,pos可选择主要参数,特定字符串数组的起止部位,默认设置为 0,endpos可选主要参数,特定字符串数组的完毕部位,默认设置为字符串数组的长短
举例说明:
>>> import re
>>>
>>> pattern = re.compile(r'\d ') # 搜索数据
>>> result1 = pattern.findall('runoob 123 google 456')
>>> result2 = pattern.findall('run88oob123google456', 0, 10)
>>>
>>> print(result1)
['123', '456']
>>> print(result2)
['88', '12']
re.finditer
和 findall 相近,在字符串数组中寻找正则表达式所配对的全部子串,并把他们做为一个迭代器回到
re.finditer(pattern, string, flags=0) # pattern配对的正则表达式,string要配对的字符串数组,flags标志位,用以操纵正则表达式的配对方法,如:是不是区别英文大小写,几行配对这些
举例说明:
import re
it = re.finditer(r"\d ","12a32bc43jf3")
for match in it:
print (match.group() )
輸出結果:
12
32
43
3
re.split
split 方式依照可以配对的子串将字符串分割后返回列表
re.split(pattern, string[, maxsplit=0, flags=0]) # pattern配对的正则表达式,string要配对的字符串数组,maxsplit隔开频次,maxsplit=1 隔开一次,默认设置为 0,不限定频次,flags标志位,用以操纵正则表达式的配对方法,如:是不是区别英文大小写,几行配对这些
举例说明:
>>>import re
>>> re.split('\W ', 'runoob, runoob, runoob.')
['runoob', 'runoob', 'runoob', '']
>>> re.split('(\W )', ' runoob, runoob, runoob.')
['', ' ', 'runoob', ', ', 'runoob', ', ', 'runoob', '.', '']
>>> re.split('\W ', ' runoob, runoob, runoob.', 1)
['', 'runoob, runoob, runoob.']
>>> re.split('a*', 'hello world') # 针对一个找不着配对的字符串数组来讲,split 不容易对其做出切分
['hello world']
正则表达式目标
re.RegexObject
re.compile() 回到 RegexObject 目标
re.MatchObject
group() 回到被 RE 配对的字符串数组
- start() 回到配对逐渐的部位
- end() 回到配对完毕的部位
- span() 回到一个元组包括配对 (逐渐,完毕) 的部位
正则表达式修饰符 – 可选标示
正则表达式能够包括一些可选标示修饰符来操纵配对的方式。修饰符被特定为一个可选择的标示。好几个标示能够根据按位 OR(|) 他们来特定。如 re.I | re.M 被设成 I 和 M 标示:
修饰符 | 叙述 |
---|---|
re.I | 使配对对英文大小写不比较敏感 |
re.L | 做本土化鉴别(locale-aware)配对 |
re.M | 几行配对,危害 ^ 和 $ |
re.S | 使 . 配对包含自动换行以内的全部标识符 |
re.U | 依据Unicode字段名分析标识符。这一标示危害 \w, \W, \b, \B. |
re.X | 该标示根据给与你更灵便的文件格式便于你将正则表达式写的更便于了解。 |
正则表达式方式
方式字符串数组应用独特的英语的语法来表明一个正则表达式:
英文字母和数字表示她们本身。一个正则表达式方式中的英文字母和数据配对一样的字符串数组。
大部分英文字母和数据前面一个反斜杠的时候会有着不一样的含意。
标点仅有被转义时才配对本身,不然他们表明独特的含意。
反斜杠自身必须应用反斜杠转义。
因为正则表达式一般 都包括反斜杠,因此 你最好应用初始字符串数组来表明他们。方式原素(如 r’\t’,等额的于 ‘\t’)配对相对的特殊符号。
下表列出了正则表达式方式英语的语法中的独特原素。假如你应用方式的另外出示了可选择的标示主要参数,一些方式原素的含意会更改。
方式 | 叙述 |
---|---|
^ | 配对字符串数组的开始 |
$ | 配对字符串数组的结尾 |
. | 配对随意标识符,除开换行符,当re.DOTALL标识被特定时,则能够配对包含换行符的随意标识符 |
[…] | 用于表明一组标识符,独立列举:[amk] 配对 ‘a’,’m’或’k’ |
[^…] | 没有[]中的标识符:[^abc] 配对除开a,b,c以外的标识符 |
re* | 配对0个或好几个的关系式 |
re | 配对一个或好几个的关系式 |
re? | 配对0个或一个由前边的正则表达式界定的精彩片段,非贪欲方法 |
re | 精准配对 n 个前边关系式。比如, o |
re | 配对 n 个前边关系式。比如, o |
re | 配对 n 到 m 次由前边的正则表达式界定的精彩片段,贪欲方法 |
a | b |
(re) | 对正则表达式排序并记牢配对的文字 |
(?imx) | 正则表达式包括三种可选标示:i, m, 或 x 。只危害括弧中的地区 |
(?-imx) | 正则表达式关掉 i, m, 或 x 可选标示。只危害括弧中的地区 |
(?: re) | 相近 (…), 可是不表明一个组 |
(?imx: re) | 在括弧中应用i, m, 或 x 可选标示 |
(?-imx: re) | 在括弧中不应用i, m, 或 x 可选标示 |
(?#…) | 注解. |
(?= re) | 前向毫无疑问定义符。假如所含正则表达式,以 … 表明,在所在位置取得成功配对时取得成功,不然不成功。但一旦所含关系式早已试着,配对模块压根沒有提升;方式的剩下一部分也要试着定义符的右侧 |
(?! re) | 前向否认定义符。与毫无疑问定义符反过来;当所含关系式不可以在字符串数组所在位置配对时取得成功 |
(?> re) | 配对的单独方式,省掉回朔 |
\w | 配对非英文字母数据及下横线 |
\s | 配对随意空白字符,等额的于 [\t\n\r\f]. |
\S | 配对随意非空字符 |
\d | 配对随意数据,等额的于 [0-9]. |
\D | 配对随意非数据 |
\A | 配对字符串数组逐渐 |
\Z | 配对字符串数组完毕,如果是存有自动换行,只配对到自动换行前的完毕字符串数组 |
\z | 配对字符串数组完毕 |
\G | 配对最终配对进行的部位 |
\b | 配对一个英语单词界限,也是指英语单词和空格符间的部位。比如, ‘er\b’ 能够配对”never” 中的 ‘er’,但不可以配对 “verb” 中的 ‘er’ |
\B | 配对非英语单词界限。’er\B’ 能配对 “verb” 中的 ‘er’,但不可以配对 “never” 中的 ‘er’ |
\n, \t, 等. | 配对一个换行符。配对一个制表符。等 |
\1…\9 | 配对第n个排序的內容 |
\10 | 配对第n个排序的內容,假如它经配对。不然指的是八进制标识符码的关系式 |
常见正则表达式
校检数据的关系式
- 数据:^[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)$
校检标识符的关系式
- 中国汉字:^[\u4e00-\u9fa5]{0,}$
- 英语和数据:^[A-Za-z0-9] $ 或 ^[A-Za-z0-9]{4,40}$
- 长短为3-20的全部标识符:^.{3,20}$
- 由26个英文英文字母构成的字符串数组:^[A-Za-z] $
- 由二十六个大写英文英文字母构成的字符串数组:^[A-Z] $
- 由二十六个小写字母英语字母构成的字符串数组:^[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]
独特要求关系式
- 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)$
- 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?)[^>]>.?|<.? /> (在网上广为流传的版本号太槽糕,上边这一也只是能一部分,针对繁杂的嵌入标识依然束手无策)
- 头尾空白字符的正则表达式:^\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)) (由@巨龙三少 出示,谢谢共享资源)
-
钱的键入文件格式:
- 有四种钱的表明方式我们可以接纳:”10000.00″ 和 “10,000.00″, 和沒有 “分” 的 “10000″ 和 “10,000″:^[1-9][0-9]*$
- 这表明随意一个不因0开始的数据,可是,这也代表着一个字符”0″不通过,因此 大家选用下边的方式:^(0|[1-9][0-9]*)$
- 一个0或是一个不因0开始的数据.大家还能够容许开始有一个负号:^(0|-?[1-9][0-9]*)$
- 这表明一个0或是一个很有可能为负的开始不以0的数据.让客户以0开始好啦.把负号的也除掉,由于钱总不可以是负的吧.下边我们要加的是表明很有可能的小数部分:^[0-9] (.[0-9] )?$
- 务必表明的是,小数位后边最少应当有1十位数,因此 ”10.”不是根据的,可是 “10″ 和 “10.2″ 是根据的:^[0-9] (.[0-9]{2})?$
- 那样大家要求小数位后边务必有俩位,假如你觉得太严苛了,能够那样:^[0-9] (.[0-9]{1,2})?$
- 那样就容许客户只写一位小数。下边大家该考虑到数据中的分号了,我们可以那样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
- 1到3个数据,后边跟随随意个 分号 3个数据,分号变成可选,而不是务必:^([0-9] |[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
- 备注名称:这就是最后結果了,别忘记” ”可以用”*”取代。如果你觉得空字符串还可以接纳得话(怪异,为何?)最终,别忘记再用涵数时除掉除掉那一个反斜杠,一般的不正确都在这儿