(一)正则表达式常用特殊字符
特殊符号 | 描述 | 示例 | 示例意义 |
| | 管道符号,表示选择其中一个进行匹配 | re1| re2 | 选择匹配正则表达式re1或者re2 |
. | 匹配除去 之外的任意字符 | d.d | 表示匹配d与d之间为任意字符的情况,如“did”“d2d”等 |
^ | 匹配字符串起始部分 | ^my | 表示任何以my作为开始的字符串 |
$ | 匹配字符串终止符 | bye$ | 表示匹配任何以bye结束的字符串 |
* | 匹配0或者多次左端出现的正则表达式 | [0-9]* | 表示匹配以任意个数字开始的字符串 |
+ | 匹配1次或者多次左端出现的正则表达式 | [0-9]+ | 表示匹配以1个或者多个数字开始的字符串 |
? | 匹配0次或者1次左端出现的正则表达式 | [0-9]? | 表示匹配以0个或者1个数字开始的字符串 |
{N} | 匹配N次左端出现的正则表达式 | [0-9]{N} | 匹表示配以N个数字开始的字符串 |
{M,N} | 匹配M次到N次左端出现的正则表达式 | [0-9]{M,N} | 匹表示配以M个到N个数字开始的字符串 |
[...] | 匹配来自括号中字符集的任意一个 | [abcd] | 表示匹配a或者b或者c或者d |
[.-.] | 匹配从.到.之间的任意一个字符 | [a-g] | 表示匹配a到g之间的任意一个字符,如a或b... |
[^...] | 不匹配此字符集中的任何一个字符 | [^abc] | 表示匹配不是字符a或b或c的任意字符 |
() | 对正则表达式进行分组或者匹配子组 | ([0-9]{3})? | 表示匹配三个数字出现一次或者不出现的情况 |
特殊字符 | 描述 | 示例 | 示例意义 |
d (D) | d匹配任何一个十进制数字,D不匹配任何数字 | ddd | 匹配三个数字的字符串 |
w (W) | w匹配任何一个字母字符,W不匹配任何字母字符 | w+ | 匹配一个由字母字符组成的字符串 |
s (S) | s匹配任何空格字符,S不匹配任何空格字符 | ofsthe | 匹配of和the之间有任何空格字符的情况 |
(B) | 匹配任何单词边界,B不匹配任何单词边界 | the | 任何以the开始的字符串 |
N | 匹配已保存的子组N | price:N | 匹配price:后面加已保存的子组N的形式 |
c | 仅按照c的字面意思进行匹配 | * | 匹配字符* |
A() | A匹配字符串的开始,匹配字符串的结尾 | Acar | 匹配以car开始的字符串 |
特殊符号 | 描述 | 示例 | 示例意义 |
| | 管道符号,表示选择其中一个进行匹配 | re1| re2 | 选择匹配正则表达式re1或者re2 |
. | 匹配除去 之外的任意字符 | d.d | 表示匹配d与d之间为任意字符的情况,如“did”“d2d”等 |
^ | 匹配字符串起始部分 | ^my | 表示任何以my作为开始的字符串 |
$ | 匹配字符串终止符 | bye$ | 表示匹配任何以bye结束的字符串 |
* | 匹配0或者多次左端出现的正则表达式 | [0-9]* | 表示匹配以任意个数字开始的字符串 |
+ | 匹配1次或者多次左端出现的正则表达式 | [0-9]+ | 表示匹配以1个或者多个数字开始的字符串 |
? | 匹配0次或者1次左端出现的正则表达式 | [0-9]? | 表示匹配以0个或者1个数字开始的字符串 |
{N} | 匹配N次左端出现的正则表达式 | [0-9]{N} | 匹表示配以N个数字开始的字符串 |
{M,N} | 匹配M次到N次左端出现的正则表达式 | [0-9]{M,N} | 匹表示配以M个到N个数字开始的字符串 |
[...] | 匹配来自括号中字符集的任意一个 | [abcd] | 表示匹配a或者b或者c或者d |
[.-.] | 匹配从.到.之间的任意一个字符 | [a-g] | 表示匹配a到g之间的任意一个字符,如a或b... |
[^...] | 不匹配此字符集中的任何一个字符 | [^abc] | 表示匹配不是字符a或b或c的任意字符 |
() | 对正则表达式进行分组或者匹配子组 | ([0-9]{3})? | 表示匹配三个数字出现一次或者不出现的情况 |
修饰符 | 描述 |
---|---|
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 w, W, , B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
附:http://tool.chinaz.com/regex(正则表达式在线测试,站长工具)
https://tool.oschina.net/regex(开源中国正则表达式测试)
(二)Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。re 模块使 Python 语言拥有全部的正则表达式功能。
(2.1)re.match(pattern,string,flags),三个参数分别是正则表达式,字符串和标志位。该函数尝试从第一个位置进行匹配,如果不在第一个位置则返回一个none
import re print(re.match('www', 'www.runoob.com').span()) # 在起始位置匹配 print(re.match('com', 'www.runoob.com')) # 不在起始位置匹配
输出结果为
(0, 3)
None
(2.2)re.search方法,扫描整个字符串并且返回第一个匹配情况
函数语法:re.search(pattern, string, flags=0)
import re a = "best" match = re.search(a,"umji isbest umji inworld") if match: print(match.group()) print(match.start()) print(match.end()) print(match.span()) print(type(match.group()))
输出结果:
best 7 11 (7, 11) <class 'str'>
(2.3)re.sub方法替换字符串中的匹配项
函数语法:re.sub(pattern, repl, string, count=0, flags=0)
参数类型:模式字符串,替换的字符串,原字符串,最多替换次数(count=0为全部替换)
import re phone="156-0313-1526#这是一个移动的电话" phone=re.sub(r"#.*$","",phone) print(phone) phone=re.sub("-","",phone) print(phone)
输出结果:
156-0313-1526 15603131526
当repl为函数时
import re # 将匹配的数字乘以 2 def double(matched): value = ""+matched.group('value') return value+value s = 'A23G4HFD567' print(re.sub('(?P<value>[A-F])', double, s)) print(s)
输出结果:
AA23G4HFFDD567 A23G4HFD567
(2.4)re.compile()用于 生成一个pa'ttern对象用于实现match和search函数
语法格式:re.compile(pattern[, flags])
import re pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I) # re.I 表示忽略大小写 m = pattern.match('Hello World Wide Web') print(m) # 匹配成功,返回一个 Match 对象 print(m.group(0)) # 返回匹配成功的整个子串 print(m.span(0)) # 返回匹配成功的整个子串的索引 print(m.group(1)) # 返回第一个分组匹配成功的子串 print(m.span(1)) # 返回第一个分组匹配成功的子串的索引 print(m.group(2)) # 返回第二个分组匹配成功的子串 print(m.span(2)) # 返回第二个分组匹配成功的子串 print(m.groups()) # 等价于 (m.group(1), m.group(2), ...)
输出结果:
Hello World (0, 11) Hello (0, 5) World (6, 11) ('Hello', 'World')
(2.5)re.findall函数,用来返回所有的满足条件的结构,返回类型是一个列表
import re pattern = re.compile(r'd+') # re.I 表示忽略大小写 m = pattern.findall('Hello342World43Wide2423Web') n = pattern.findall('Hello342World43Wide2423Web', 0, 8)#限制检索位置 print(m) print(n)
输出结果:
['342', '43', '2423'] ['342']
(2.6)re.finditer函数与上面的findall函数类似只不过返回的是一个迭代器
import re pattern = re.compile(r'd+') #与findall类似,只不过返回的是一个迭代器 m = pattern.finditer('Hello342World43Wide2423Web') for n in m: print(n.group())
输出结果:
342 43 2423
(2.7)re.spilt函数主要用于分割字符串
函数使用方法:re.split(pattern, string[, maxsplit=0, flags=0])最后两个参数为分割次数(默认为0即全部分割)和标志位
import re #按照字符数字下划线以外的字符分割 res=re.split('W',"我的信息:电话-110 年龄-18 性别-男") print(res) pattern=re.compile('W') res1=pattern.split("我的信息:电话-110 年龄-18 性别-男") print(res1)
输出结果:
['我的信息', '电话', '110', '年龄', '18', '性别', '男'] ['我的信息', '电话', '110', '年龄', '18', '性别', '男']
正则表达式实例
[Pp]ython | 匹配 "Python" 或 "python" |
rub[ye] | 匹配 "ruby" 或 "rube" |
[aeiou] | 匹配中括号内的任意一个字母 |
[0-9] | 匹配任何数字。类似于 [0123456789] |
[a-z] | 匹配任何小写字母 |
[A-Z] | 匹配任何大写字母 |
[a-zA-Z0-9] | 匹配任何字母及数字 |
[^aeiou] | 除了aeiou字母以外的所有字符 |
[^0-9] | 匹配除了数字外的字符 |