关于正则表达式的完整整理(python)
上传图片,以示清白。
正则(Regular Expression)
在python的运用当中,正则表达式可是非常重要的,无论是进行爬虫,或者是进行某些判定,都必不可少,接下来,我们谈谈正则表达式。望各位兄多多指教。
1 import re 2 result=re.match("abc",'abc.cm') 3 print(result.group())
就是这样,re 导入,来波分割线,开始进入正题。
====================================================================
首先是正则表达式的单字符匹配(字符)
示例:
1 >>> a=re.match(".","a") 2 >>> print(a.group()) 3 a
1 >>> print(re.match("[bB]","beautiful").group()) 2 b 3 >>> print(re.match("[bB]","Beautiful").group()) 4 B
1 >>> print(re.match("今天星期\d","今天星期1").group()) 2 今天星期1 3 >>>
====================================================================
原始字符串,即r
在python的正则表达式中,‘\’是转义字符(字母数字前加入‘\’后具有特殊意义?如‘\n’换行),所以就有一个问题,如何匹配'\',如果正常使用语言来表达的话,那么就需要使用到4个反斜杠。前两个和后两个分别转义成反斜杠,然后合并两个反斜杠成为一个反斜杠。(好像挺有意思的,但是很麻烦),所以就衍生出了原生字符串,解决了这个问题。
1 >>> import re 2 >>> a='c:\\a\\b\\c' 3 >>> b=re.match(r'c:\\a',a).group() 4 >>> print(b) 5 c:\a
====================================================================
匹配多个字符(数量)
示例:
1 >>> print(re.match("[A-Z][a-z]*","Dddfefdfd").group()) 2 Dddfefdfd 3 >>> 匹配第一个字母大写,第二个字母以及后面的都是或者无小写字母
1 >>> print(re.match("[A-Za-z_]+[\w_]*","hello1123").group()) 2 hello1123 3 >>> 匹配
1 >>> print(re.match("[1-9]?[0-9]","98").group()) 2 98 3 >>> 匹配0-99
1 >>> print(re.match("[A-Za-z0-9_]{8,20}","hellodfejkjafejls1123").group()) 2 hellodfejkjafejls112 3 >>> 匹配8-20位的匹配字符
====================================================================
匹配字符的边界问题(边界)
示例:
1 >>> print(re.match("[\w]{4,20}@163\.com$","[email protected]").group()) 2 [email protected].com 3 >>> $匹配结束
1 >>> print(re.match("[\w]{4,20}@163\.com$","[email protected]").group()) 2 Traceback (most recent call last): 3 File "<stdin>", line 1, in <module> 4 AttributeError: 'NoneType' object has no attribute 'group' 5 >>>
1 >>> print(re.match(r".*\buti\b","bea uti ful").group()) 2 bea uti 3 >>> 字母边界
====================================================================
正则表达式的分组
示例:
1 >>> print(re.match("[1-9]?\d$|100","100").group()) 2 100 3 >>> print(re.match("[1-9]?\d$|100","98").group()) 4 98 5 >>> |分组
1 >>> print(re.match("\w{4,20}@(163|126|qq)\.com","[email protected]").group()) 2 [email protected] 3 >>> print(re.match("\w{4,20}@(163|126|qq)\.com","[email protected]").group()) 4 [email protected].com 5 >>> ()分组匹配163、126、qq邮箱
1 >>> print(re.match(r"<([a-zA-Z]*)>\w*</\1>","<html>fej</html>").group()) 2 <html>fej</html> 3 >>> print(re.match(r"<([a-zA-Z]*)>\w*</\1>","<html>fej</html2>").group()) 4 Traceback (most recent call last): 5 File "<stdin>", line 1, in <module> 6 AttributeError: 'NoneType' object has no attribute 'group' 7 >>> 引用分组1匹配到的字符串,如果与1不匹配,则报错,如果有多个标签,不妨多个\2
1 >>> print(re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>","<html><h1>www.baidu.com</h1></html>").group()) 2 <html><h1>www.baidu.com</h1></html> 3 >>> 自定义分组
====================================================================
re的高级用法
search
1 >>> print(re.search(r"\d+","今天吃了23455顿饭").group()) 2 23455 3 >>> match改为search了
findall
1 >>> print(re.findall(r"\d+","今天吃了23455顿饭,跑了35666公里,走了313步")) 2 ['23455', '35666', '313'] 3 >>> 返回list
sub
1 >>> a=re.sub(r"\d+","9999","python=123") 2 >>> print(a) 3 python=9999 4 >>> 替换
split
1 >>> print(re.split(r":| ","abc:dongguan shandong jinan")) 2 ['abc', 'dongguan', 'shandong', 'jinan'] 3 >>> 切片
compile(结合findall)
1 >>> a=re.compile('[a-zA-Z]') 2 >>> b=a.findall('[email protected]#5xmd') 3 >>> print(b) 4 ['d', 'e', 'n', 'm', 's', 'c', 'm', 'm', 'd', 'x', 'm', 'd'] 5 >>> 可以自行领悟
====================================================================
python的贪婪和非贪婪
python里的数量词默认是贪婪的,就是说会尝试的尽可能多的匹配字符。
在".","*","+",{m}后面加上?,可以使贪婪变成非贪婪
1 >>> print(re.match(r"aa(\d+)","aa2343ddd").group(1)) 2 2343 3 >>> print(re.match(r"aa(\d+?)","aa2343ddd").group(1)) 4 2 5 >>>