关于正则表达式的完整整理(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$","dfefsfakdnf@163.com").group())
2 dfefsfakdnf@163.com
3 >>> $匹配结束
1 >>> print(re.match("[\w]{4,20}@163\.com$","dfefsfakdnf@163.com222").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","adbc@qq.com").group())
2 adbc@qq.com
3 >>> print(re.match("\w{4,20}@(163|126|qq)\.com","adbc@163.com").group())
4 adbc@163.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('den3ms31cm593md@#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 >>> 

 

posted @ 2017-10-15 21:19  编程好累啊!  阅读(601)  评论(0编辑  收藏  举报