今天总结一下正则表达式,它用来解决模糊匹配的问题,几乎在所有编程语言中都可以用,尤其在python爬虫中,它是一门必修知识;
所谓模糊匹配,就是在匹配字符串中,有一部分是确定的,另一部分是不确定的值但有范围的任意值;
这样我们就可以用一些具有特殊含义的符号,对字符串进行另一种描述,而这些特殊含义的符号就组成一个正则表达式。
正则表达式与re模块
正则表达式也内嵌在Python中,通过re模块来实现,常用方法是findall(),会将匹配到的字符串用一个列表返回
例如: 要匹配一大串字符串中的所有数字,不用for循环和If语句,用re模块一行就能实现
import re
print(re.findall('\d+',"sadfjk11ksk22iuir33bndb44uidu55sgsfir66o77"))
运行结果:
字符匹配
普通字符匹配
import re
print(re.findall('bigbig',"Iwannaabigbigjuicecanyougiveme?"))
#findall第一个参数是需要匹配的子串或子串规则,第二个参数为母串
运行结果:
利用元字符进行模糊匹配
元字符: . ^ $ + ? {} [] | () \
- .任意字符:
import re
#匹配b开头g结尾的子串,..表示任意的两个字符,如果不是两个,那就匹配不出来
print(re.findall('b..g',"abcdefgabcdghijklmn"))
运行结果:
- ^只能为开头:
import re
#匹配b开头g结尾的子串
#^表示子串的第一个字符只能在母串的开头,..表示任意的两个字符
print(re.findall('^b..g',"bbcgefgabcdghijblmg"))
运行结果:
- $只能以结尾:
import re
#匹配b开头g结尾的子串
#$表示子串的最后一个字符只能在母串的结尾,..表示任意的两个字符
print(re.findall('b..g$',"abcdefgabcdghijblmg"))
运行结果:
重复的字符匹配
-
贪婪匹配: 即尽量多地匹配,与之相反的是惰性匹配
-
*是0到无穷个:
import re
#*表示子串的某个字符可以0到无穷次出现
print(re.findall('Wo23*Le',"sjfkufiWo233333333333333333333Le"))
运行结果:
- +是1到无穷个:
import re
#+表示子串的某个字符可以1到无穷次出现(该元素至少出现一次),..表示任意的两个字符
print(re.findall('Wo23+Le',"sjfkufiWo233333333333333333333Le"))
#与*的区别匹配
print(re.findall('Wo23*',"dsjfkjfiWo2")) #能匹配到内容
print(re.findall('Wo23+',"dsjfkjfiWo2")