匹配格式
模式 | 描述 |
^ | 匹配字符串的开头 |
$ | 匹配字符串的末尾。 |
. | 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。 |
[...] | 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k' |
[^...] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。 |
re* | 匹配0个或多个的表达式。 |
re+ | 匹配1个或多个的表达式。 |
re? | 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 |
re{ n} | |
re{ n,} | 精确匹配n个前面表达式。 |
re{ n, m} | 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 |
a| b | 匹配a或b |
(re) | G匹配括号内的表达式,也表示一个组 |
(?imx) | 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。 |
(?-imx) | 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。 |
(?: re) | 类似 (...), 但是不表示一个组 |
(?imx: re) | 在括号中使用i, m, 或 x 可选标志 |
(?-imx: re) | 在括号中不使用i, m, 或 x 可选标志 |
(?#...) | 注释. |
(?= re) | 前向肯定界定符。如果所含正则表达式,以 ... 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。 |
(?! re) | 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功 |
(?> re) | 匹配的独立模式,省去回溯。 |
\w | 匹配字母数字 |
\W | 匹配非字母数字 |
\s | 匹配任意空白字符,等价于 [\t\n\r\f]. |
\S | 匹配任意非空字符 |
\d | 匹配任意数字,等价于 [0-9]. |
\D | 匹配任意非数字 |
\A | 匹配字符串开始 |
\Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。c |
\z | 匹配字符串结束 |
\G | 匹配最后匹配完成的位置。 |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 |
\B | 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。 |
\n, \t, 等. | 匹配一个换行符。匹配一个制表符。等 |
\1...\9 | 匹配第n个分组的子表达式。 |
\10 | 匹配第n个分组的子表达式,如果它经匹配。否则指的是八进制字符码的表达式。 |
match和search的区别
Python提供了两种不同的原始操作:match和search。match是从字符串的起点开始做匹配,而search(perl默认)是从字符串做任意匹配。
注意:当正则表达式是' ^ '开头时,match与search是相同的。match只有当且仅当被匹配的字符串开头就能匹配 或 从pos参数的位置开始就能匹配 时才会成功。如下:
贪婪模式?,+,*,{m[,n]}
>>> import re
>>> m = re.search("(book)+","mebookbookme")
>>> m.group()
'bookbook'
>>> m.groups()
('book',)
>>> re.findall("(book)+","mebookbookme")
['book']
>>> m = re.search("((?:book)+)","mebookbookme")
>>> m.group()
'bookbook'
>>> m.groups()
('bookbook',)
>>> re.findall("((?:book)+)","mebookbookme")
['bookbook']
>>> m = re.search("(book+)","mebookbookme")
>>> m.group()
'book'
>>> m.groups()
('book',)
>>> re.findall("(book+)","mebookbookme")
['book', 'book']
python非贪婪、多行匹配正则表达式例子
Python 正则提取并赋值的问题
Python对unicode文件的读写和使用正则表达式
python类库31[正则表达式]
常用正则表达式
验证数字的正则表达式集
匹配特定数字:
^[1-9]\d*匹配正整数//匹配正整数−[1−9]\d∗ //匹配负整数
^-?[1-9]\d*匹配整数//匹配整数[1−9]\d∗|0 //匹配非负整数(正整数 + 0)
^-[1-9]\d*|0匹配非正整数(负整数)//匹配非正整数(负整数+0)[1−9]\d∗\.\d∗|0\.\d∗[1−9]\d∗ //匹配正浮点数
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)匹配负浮点数//匹配负浮点数−?([1−9]\d∗\.\d∗|0\.\d∗[1−9]\d∗|0?\.0+|0) //匹配浮点数
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0匹配非负浮点数(正浮点数)//匹配非负浮点数(正浮点数+0)(−([1−9]\d∗\.\d∗|0\.\d∗[1−9]\d∗))|0?\.0+|0 //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正
匹配特定字符串:
^[A-Za-z]+匹配由个英文字母组成的字符串//匹配由26个英文字母组成的字符串[A−Z]+ //匹配由26个英文字母的大写组成的字符串
^[a-z]+匹配由个英文字母的小写组成的字符串//匹配由26个英文字母的小写组成的字符串[A−Za−z0−9]+ //匹配由数字和26个英文字母组成的字符串
^\w+$ //匹配由数字、26个英文字母或者下划线组成的字符串
匹配中文字符的正则表达式: [\u4e00-\u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符(包括汉字在内):[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行
匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:^\s*|\s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
匹配中国邮政编码:[1-9]\d{5}(?!\d)
评注:中国邮政编码为6位数字
匹配身份证:\d{15}|\d{18}
评注:中国的身份证为15位或18位
匹配ip地址:\d+\.\d+\.\d+\.\d+
评注:提取ip地址时有用
整数:^-?\d+非负浮点数(正浮点数):非负浮点数(正浮点数+0):\d+(\.\d+)?
正浮点数 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))非正浮点数(负浮点数)非正浮点数(负浮点数+0)((−\d+(\.\d+)?)|(0+(\.0+)?))
负浮点数 ^(-(([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][0-9]*验证非零的负整数:验证非零的负整数:\-[1−9][0−9]∗
验证非负整数(正整数 + 0) ^\d+验证非正整数(负整数)验证非正整数(负整数+0)((−\d+)|(0+))
验证数字:^[0-9]*验证位的数字:验证n位的数字:\dn
验证至少n位数字:^\d{n,}验证位的数字:验证m−n位的数字:\dm,n
验证零和非零开头的数字:^(0|[1-9][0-9]*)验证有两位小数的正实数:验证有两位小数的正实数:[0−9]+(.[0−9]2)?
验证有1-3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
验证用户密码:^[a-zA-Z]\w{5,17}正确格式为:以字母开头,长度在6-18之间,只能包含字符、数字和下划线。 验证是否含有 ^%&',;=?正确格式为:以字母开头,长度在6-18之间,只能包含字符、数字和下划线。 验证是否含有 ^%&',;=?\" 等字符:[^%&',;=?验证汉字:\x22]+验证汉字:[\u4e00−\u9fa5],0,
验证Email地址:^\w+[-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*验证:验证InternetURL:http://([\w−]+\.)+[\w−]+(/[\w−./? ;^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?验证电话号码:验证电话号码:(\(\d3,4\)|\d3,4−)?\d7,8:--正确格式为:XXXX-XXXXXXX,XXXX-XXXXXXXX,XXX-XXXXXXX,XXX-XXXXXXXX,XXXXXXX,XXXXXXXX。
验证身份证号(15位或18位数字):^\d{15}|\d{}18
验证一年的个月:验证一年的12个月:(0?[1−9]|1[0−2]) 正确格式为:“01”-“09”和“1”“12”
验证一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$ 正确格式为:01、09和1、31。
补充
正则表达式常用5种操作
re.match(pattern, string) # 从头匹配
re.search(pattern, string) # 匹配整个字符串,直到找到一个匹配
re.split() # 将匹配到的格式当做分割点对字符串分割成列表
re.findall() # 找到所有要匹配的字符并返回列表格式
re.sub(pattern, repl, string, count,flag) # 替换匹配到的字符
运行结果如下
re模块
常用正则表达式符号
'.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
'^' 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
'$' 匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
'*' 匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac") 结果为['abb', 'ab', 'a']
'+' 匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
'?' 匹配前一个字符1次或0次
'{m}' 匹配前一个字符m次
'{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
'|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
'(...)' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c
'\A' 只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的
'\Z' 匹配字符结尾,同$
'\d' 匹配数字0-9
'\D' 匹配非数字
'\w' 匹配[A-Za-z0-9]
'\W' 匹配非[A-Za-z0-9]
's' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'
'(?P<name>...)' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city") 结果{'province': '3714', 'city': '81', 'birthday': '1993'}