首页 > 技术文章 > 9.正则和re模块

journeyer-xsh 2020-07-13 17:11 原文

一、正则表达式

正则表达式:一些有特殊含义的字符组合到一起,形成一套规则,用于匹配字符串的。

用途:1、检测字符串是否合法2、从大文件中找到符合规则的内容放到字符组和非字符组中表示所有

正则表达式常用规则

'.'     默认匹配除\n之外的任意一个字符
'^'     匹配字符开头
'$'     匹配字符结尾
'*'     匹配*号前的字符0次或多次
'+'     匹配前一个字符1次或多次
'?'     匹配前一个字符1次或0次 
'{m}'   匹配前一个字符m次
'{n,m}' 匹配前一个字符n到m次
'|'     匹配|左或|右的字符
'(...)' 分组匹配, re.search("(abc){2}a(123|45)", "abcabca456c").group() 结果为'abcabca45'
 
'\A'    只从字符开头匹配
'\Z'    匹配字符结尾,同$
'\d'    匹配数字0-9
'\D'    匹配非数字
'\w'    匹配[A-Za-z0-9],还包括下划线‘_’
'\W'    匹配非[A-Za-z0-9]
's'     匹配空白字符、\t、\n、\r 

简单示例:

# 字符组 []  
# [abc] 一个字符组只表示一个字符位置上
# [0-9] 根据ascll码
# [a-z]
# [A-Z]
# [a-zA-Z] 大小写   只有-前后才有大小比较

# [0-9]  -->\d   表示匹配一位任意数字  digit
# [0-9a-z_]  -->\w   表示数字字母下划线 word

# 空格\tab\enter --> |\t|\n  
# -->\s 表示所有空白,包括空格、tab、回车

# 正则表达式中表示匹配的内容的符号都是正则中的元字符


# \W   非数字字母下划线
# \D   非数字
# \S   非空白

# [\d]  \d  相同
# [\d\D][\w\W][\s\S]   匹配所有
# .     表示匹配除了换行符之外的任意一个字符
# [^1]   表示非字符组,除了1以外的
# [^\d]  表示匹配所有的非数字
# ^     表示匹配一个字符串的开始
# $     表示匹配一个字符串的结尾


#^a.$     在adacad这个字符串中什么也匹配不上
# ad|bc   匹配ad或bc,优先匹配左边的,不匹配右边,所以长字符在左

# 在www.中可以加\转义.
# www\.(oldboy|baidu|taobao)\.com   匹配该三个网址

#\b     匹配单词的边界

# 记忆元字符
# \d  \w  \s  \t \n 
# [] [^]        
# ^ $
# | ()

# 一个元字符只能匹配一位

量词

{n} 表示匹配n次

{n,} 表示至少匹配n次

{n, m} 表示至少n次,至多m次

? 表示匹配0或1次 {0,1}

+ 表示一次或多次 {1,}

* 表示0次或多次 {0,}

贪婪匹配和非贪婪

贪婪匹配,在量词范围允许的情况下尽量多的匹配内容
\d{3, 9}

\d{3,}6 187246693634973618728 结果:一直匹配到最后一个6,贪婪匹配回溯算法

非贪婪(惰性匹配)
########## .*?x 表示匹配字符 任意多次数,但是遇到x就停止 爬虫
########## .*x 表示匹配字符 任意多次数,但是遇最后一个x就停止 爬虫
\d{3, }?6 非贪婪,在条件允许的条件下尽量少的匹配,此例中至少匹配3次后在匹配的第一个6后停止

二、re模块

re,math 从头开始匹配

re.search 匹配包含

re.findall 把所有的匹配到的字符放到列表中,以列表中的元素返回

re.split 以匹配到的字符当作列表分隔符

re.sub 匹配字符并替换

re.fullmatch 全部匹配

推荐阅读