无论你做开发,还是测试,或者运维,正则表达式是一个IT行业从业者绕不过去的东西。
之前我面试过Nvida,面试官问了很多正则表达式的内容,这个地方非常的因吹斯汀,需要你花一定的时间进行学习巩固。
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。re 模块使 Python 语言拥有全部的正则表达式功能。
re模块中,常用的3个函数是:
re.compile,re.match,re.search
正则匹配的时候,第一个字符是r,表示的是原生字符,意在声明字符串中间的特殊字符不用转义。比如表示‘\n’,可以写成r'\n'. re.match、re.search都是精确匹配.
re.compile(pattern,flags=0)
例1:
import re content = 'Mr wang, always fall in love with neighbour,such as Mrs WANG' rr=re.compile(r'wan\w',re.I) print(rr) print(type(rr)) a=rr.findall(content) #findall 返回的是一个 list 对象 print(a) ##输出结果 re.compile('wan\\w', re.IGNORECASE) <class 're.Pattern'> ['wang', 'WANG'] ## 模式元素(r'\t',等价于\\t)匹配相应的特殊字符, 所以 r'wan\w' ----> 'wan\\w', 而\w 表示匹配字母数字下划线; re.I 表示匹配对大小写不敏感;
flags标志位有哪些参数:
pattern正则表达式模式
模式字符串使用特殊的语法来表示一个正则表达式:字母和数字表示它们本身。一个正则表达式模式中的字母和数字匹配同样的字符串。
字母和数字前面加一个\会拥有不同的含义。标点符号只有被转义时才能匹配自身,否则它们表示特殊的含义。反斜杠\本身需要反斜杠转义。由于正则表达式通常都包含反斜杠,所以最好使用原始字符串表示它们。模式元素(r'\t',等价于\\t)匹配相应的特殊字符.
下面列出正则表达式语法中的特殊元素,如果使用模式的同时还提供了可选的标志参数,某些模式元素的含义会改变。
语法:
re.match(pattern,string,flags=0)
匹配成功的话re.match()方法返回一个对象,否则返回None。可以使用group()或者groups()匹配对象函数来获取匹配的表达式。
例2:
import re str='hello 123456789 hello_word is good a lucky' result=re.match('^hello\s\d{9}.*lucky$',str) print(result) print(result.group()) ##输出结果: <re.Match object; span=(0, 42), match='hello 123456789 hello_word is good a lucky'> hello 123456789 hello_word is good a lucky result=re.match('^hello\s\d{9}.*lucky$',str)分析如下: # ^表示以hello开头的字符串 # \s 匹配的是空白字符 # \d{9}匹配9位数字 # .匹配除了换行符之外的任意字符,*匹配0次或者多次,两者结合起来可以匹配任意字符(不包括换行符) # $表示以lucky结尾的字符串
语法:
re.search(pattern,string,flags=0)
匹配成功的话re.match()方法返回一个对象,否则返回None。
我么可以使用group()或者groups()匹配对象函数来获取匹配的表达式。
group(num=0) 匹配的整个表达式的字符串,group()可以一次输入多个逗号,在这种情况下它将返回一个包含那些组所对应值的元组
groups() 返回一个包含所有小组字符串的元组,从1到所包含的小组号
例3:
import re print(re.search('www','www.lucky.www.com').group()) print(re.search('com','www.lucky.www.com').group()) ##输出结果 www com
例4:
import re line="Cats are smarter than dogs" searchObj=re.search(r'(.*) are (.*?) .*',line,re.M|re.I) if searchObj: print('searchObj.group():',searchObj.group()) print('searchObj.group(1):', searchObj.group(1)) print('searchObj.group(2):', searchObj.group(2)) else: print('Nothing found...') ##输出结果 searchObj.group(): Cats are smarter than dogs searchObj.group(1): Cats searchObj.group(2): smarter
例5:
import re str='hello,my name is lucky' p=re.compile('hello') c=p.match(str) #match表示匹配到以hello开头的行 print(c.group()) #匹配到则显示hello ##输出结果 hello import re str='H hello,my name is lucky' p=re.compile('hello') c=p.match(str) print(c.group()) ##输出结果 print(c.group()) AttributeError: 'NoneType' object has no attribute 'group'
例6:
import re p=re.compile('my') str='hello,my name is lucky' print(p.search(str)) c=p.search(str) print(c.group()) #输出结果 <re.Match object; span=(6, 8), match='my'> my
注意点:
常见的正则匹配样例:
1)'\S','\s' import re str='hello,my name is lucky' print(re.findall('\S+',str)) #\S+表示匹配一个或者多个非空白字符,以列表的形式存起来 print(re.findall('\s+',str)) #\s+匹配一个或者多个空白字符 #输出结果 ['hello,my', 'name', 'is', 'lucky'] [' ', ' ', ' '] 2)'\D','\d' import re a='one1two2three3four4five5' print(re.findall('\d+',a)) #匹配数字 print(re.findall('\D+',a)) #匹配非数字 #输出结果 ['1', '2', '3', '4', '5'] ['one', 'two', 'three', 'four', 'five'] 3)\\转义,表示可以匹配到\ import re a='abc\\dfe\\gkl\\' print(re.findall('\\\\',a)) 输出结果: ['\\', '\\', '\\'] 4). 匹配任意单个字符 import re a='one1two2three3four4five5' print(re.findall('.',a)) ##输出结果 ['o', 'n', 'e', '1', 't', 'w', 'o', '2', 't', 'h', 'r', 'e', 'e', '3', 'f', 'o', 'u', 'r', '4', 'f', 'i', 'v', 'e', '5'] 5).+ 匹配所有的内容 import re a='one1two2three3four4five5' print(re.findall('.+',a)) ##输出结果: ['one1two2three3four4five5'] 6)\w 匹配字母数字下划线 import re a='one1two2three3four4five5' print(re.findall('\w',a)) ##输出结果 ['o', 'n', 'e', '1', 't', 'w', 'o', '2', 't', 'h', 'r', 'e', 'e', '3', 'f', 'o', 'u', 'r', '4', 'f', 'i', 'v', 'e', '5'] 7)\W 匹配除了字母数字下划线的内容 import re a='one1two2three3four4five5 aaa | www' print(re.findall('\W',a)) ##输出结果: [' ', ' ', '|', ' '] 8) [0-9]匹配任意一个数字 [a-z]匹配任意一个字母 import re a='one1two2three3four4five5 aaa | www' print(re.findall('[0-9]',a)) print(re.findall('[a-z]',a)) #输出结果: ['1', '2', '3', '4', '5'] ['o', 'n', 'e', 't', 'w', 'o', 't', 'h', 'r', 'e', 'e', 'f', 'o', 'u', 'r', 'f', 'i', 'v', 'e', 'a', 'a', 'a', 'w', 'w', 'w'] 9) ^ 匹配开头 $ 匹配结尾 import re a='one1two2three3four4five5 aaa | www' print(re.findall('^o',a)) print(re.findall('w$',a)) ##输出结果 ['o'] ['w']