正则表达式是用来字符串匹配的强大工具。
本文基于python,简要的介绍总结正则表达式的引用。
一、python re 模块
在python中re模块包括了所有的正则表达式功能
re中有一个match函数,可以用于字符串匹配判断
re.match(r"123\t","123\t") #若匹配则返回一个对象,不匹配返回为空
re.search(r"\d+","python =10086")#从头到尾匹配
#findall 返回值为列表,匹配所有满足正则的字串
re.findall(r"\d+","python = 100 ,c = 200 ,c++ = 300,java =400 )
二、 r转义字符
在字符串前加上r ,则该字符串变为raw string ,即原生字符串。
raw string 中转义字符不再转义 ,例如 ’\tabc\n’ ,使用print输出的时候,现实的一个tab+abc+回车 。 但是加入r后,r‘\tabc\n’ 输出时,就仍然是‘\tabc\n’ ,反斜杠仍然是反斜杠,python解释器不进行转义。
由于正则表达式会进行转义,python解释器也会进行转义,所以一般情况下,正则表达式前都加上r字符。
作为正则表达式 ’ \ \ \ \ab’ (markdown编辑器也会转义(ˉ▽ˉ;)…
表达的应该是‘\ab’
但是需要提醒的是,使用ipython3 进行验证的时候,若直接输入字符串变量回车,而不是print输出,输出的是raw string ,如下图
三、 正则表达式
\d 匹配数字 \w 匹配字符(包括数字字符下划线以及汉字)
\s 匹配空白字符 \b 匹配单词头或单词尾
元字符的大写和小写正好相反
{m,n} 重复m到n次
{m} 重复m次 [ ] 可选项
() 成为一个组 abc| cdf 匹配abc或者cdf
^ 匹配开头 $匹配结尾
* 匹配任意个(0个或者多个)
+ 匹配至少一个(1个或多个)
. 匹配任意字符 (\n除外)
? 匹配0个或者1个
(?p< name >) 指定组名
(?p=name) 指定特定别名的组
四、re模块高级、贪婪匹配、以及编译
- re.match(r" 正则表达式","匹配的字符串” )若成功匹配则返回一个Match对象,否则返回None ,该对象调用group()可返回匹配的字串
group(0)表示原始字串,group(i) (i!=0)表示对应组的字串。 - re.search() 与match类似,区别是不从开头匹配 如
print(re.search(r"/d+","浏览量: 9999").group()) # '9999'
- re.findall() 的区别在于,匹配字符串中全部的字串,返回一个列表
print(re.findall(r"/d+","a=123,b=456,c=789")) # ['123','456','789']
- re.sub() 用于替换字串
ret = re.sub(r"\d+","xyz","aj=10,converse=20,vans=30")
ret 为 aj=xyz,converse=xyz,vans=xyz
sub函数第二个参数可以是一个函数,例如:
def fuc(gp):
num = gp.group()
addnum = int(num)
addnum += 111
return str(addnum)
ret = re.sub(r"\d+", fuc , "ak47 m16 98k")
print(ret) # ak158 m127 109k
贪婪匹配:
什么是贪婪匹配呢?就是在匹配字串的时候会优先尽可能多地匹配,看下面这个例子
re.match(r"\d+(0*)","1089760000").groups()
结果是[’ 1089760000 ’ , ‘ ’ ] 那么在想要提取字串后缀零的时候就遇到困难了,那怎么解决呢,怎么把贪婪匹配模式变成非贪婪匹配模式呢?
在 ’ * ’ 、’ ?’ 、’ + ’ 等后面加上? 就可以变成非贪婪字符,这样就会尽可能少得匹配字符串。
编译:
在处理正则表达式的时候,re模块会先将正则表达式进行编译,然后再用编译好的表达式进行匹配。当要使用正则的次数较多时,每次都编译会使得程序的效率低下,所以可以选择预编译。
Reg=re.compile(r"\d+")
编译后生成一个正则对象,然后就可以不用传入正则表达式调用match等方法了
五、正则表达式小应用
匹配电话号码:
phoneRegex = re.compile(r'''(
(\d{3}|\(\d{3}\))? # area code
(\s|-|\.)? # separator
(\d{3}) # first 3 digits
(\s|-|\.) # separator
(\d{4}) # last 4 digits
)''')
匹配邮箱
r"^[\w\.]+?@[\w]+\.com$"