正则简介:
正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。基本上主流的语言都支持正则
概述
大多数初学者都认为正则很难,实际上并不是这样的,语法不多,不经常用还会时常忘记,先说一下难点在于排他性、全面性、 匹配一个想要的字段,实际并不难
正则表达式匹配原则
1.正确性,能够正确的匹配出目标字符串怕
2.排他性,除了目标字符串之外尽可能少的匹配其他内容.
3.全面性,尽可能考虑到目标字符串的所有情况,不遗漏. .
下面是我的学习总结
使用
入门尝试
import re #导入正则第三方包
str='127.0.0.1:8080'
restr=re.findall('8080',str)
#
print(restr)
#输出:['8080']
restr2=re.findall(r':(\w+)',str)
print(restr2)
#输出:['8080']
从上面可以看出不同语法也能实现相同的效果
下面先说一些奇怪的法则,避免变异混淆
1.转义字符:. * + ? $ [ ]( )| \ (不包括【:】)
匹配上述字符需加 \ 进行转义
在使用python中使用正则匹配规则,前可以加r 表示元字符及(本身的含义)
在开发中避免错误 直接在规则前加r
import re #导入正则第三方包
str = '38$513.36'
spstr1 = re.findall('$', str) # 结果:['']
spstr2 = re.findall('\$', str) # 结果:['$'] 如果是pycharm的编译是会通过的,但有警告
spstr3 = re.findall('\\$', str) # 结果:['$']
spstr4 = re.findall(r'\$', str) # 结果:['$']
print(spstr1)
print(spstr2)
print(spstr3)
print(spstr4)
2.贪婪模式和非贪婪模式: ?
默认情况下是贪婪模式及(尽可能大的匹配内容 )
非贪婪模式:在匹配重复元字符后加’?'号即可
重复字符:+ * ? {m,n} 后面加 ? 可尽可能少的匹配内容
str="ababababababababababa"
strstr1=re.search('(ab){1,3}',str)
strstr2=re.search('(ab){1,3}?',str)#关闭贪婪模式
print(strstr1)#<re.Match object; span=(0, 6), match='ababab'>
print(strstr2)#<re.Match object; span=(0, 2), match='ab'>
3.分组 () 让操作对象当做一个整体
str='asasasaasasa'
s=re.search(r'(王|李)\w{1,2}',"王者农药").group() #(参数) 充当一个条件
print(s)#王者农
其中{1,2} 针对\w生效,因为(王|李) 是一个条件 而{n,m} 只针对前一个条件生效
\w{1,2}
定义
在正则表达式中,以()建立正则表达式的内
部分组,子组是正则表达式的一部分,可以
作为内部整体操作对象。
作用
1.可以被作为整体操作,改变元字符的操作对象
2.可以通过编程语言某些接口获取匹配内容
中,子组对应的内容部分 .group()
re. search(r' (ab)cd' , "abcd") group(1) #'ab'
捕捉组: 为分组起名字
s=re.search(r'(?P<test>王|李)\w{1,2}',"王者农药").group('test')#王
4.注意事项
●一个正则表达式中可以包含多个子组
●子组可以嵌套,但是不要重叠或者嵌套结构复杂
●子组序列号一般从外到内,从左到右计数
flags 的使用 用于选择性编码
#只能匹配ascii码字符 | regex = re. compile(r’\W+’ , flags =re.A) |
---|---|
IGNORECASE匹配忽略字母大小写 | regex = re. compile(r’ [a-z]+'flags=re.I) |
DOTALL使.可以匹配换行 | regex =re. compile( r’.+'1flags=re.S ) |
MULTILINE使^ $可以匹配每–行的开头结尾位置 | regex = re. compile(r’\W+’ , flags =re.M) |
VERBOSE为正则添加注释 | regex = re. compile(r’\W+’ , flags =re.X) |
正式开讲
参考地址:菜鸟
模式 | 描述 |
---|---|
^ | 匹配字符串的开头位置 ^janekia$ 绝对匹配。 |
$ | 匹配字符串的末尾位置。 |
. | 匹配任意字符,除了换行符。 |
[…] | 用来表示一组字符,单独列出:[amk] 匹配 ‘a’,‘m’或’k’ [abc#!好]表示0中的任意-个字符 [0-9],[a-z],[A-Z]表示区间内的任意-个字符 [ #?0-9a-z]混合书写, - -般区间表达写在后面 |
re* | 匹配 前一个条件0个或多个。 匹配规则:匹配前面的字符出现0次或多次 [A-Z][a-z]* 指定前一个条件出现的次数0次或多次 ?(0,1) < +(1,n) < *(0,n) 利用数学集合范围进行记忆 n代表多次 |
[^…] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。个的表达式。 |
re+ | 匹配1个或多个的表达式。 |
re? | 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 |
re{ n} | 匹配n个前面表达式。例如,"o{2}“不能匹配"Bob"中的"o”,但是能匹配"food"中的两个o。 |
re{ n,} | 精确匹配n个前面表达式。例如,"o{2,}“不能匹配"Bob"中的"o”,但能匹配"foooood"中的所有o。"o{1,}“等价于"o+”。"o{0,}“则等价于"o*”。 |
re{ n, m} | 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 |
a | b | 匹配a或b |
(re) | 匹配括号内的表达式,也表示一个组 |
(?imx) | 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。 |
(?-imx) | 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。 |
(?: re) | 类似 (…), 但是不表示一个组 |
(?imx: re) | 在括号中使用i, m, 或 x 可选标志 |
(?-imx: re) | 在括号中不使用i, m, 或 x 可选标志 |
(?#…) | 注释. |
(?= re) | 前向肯定界定符。如果所含正则表达式,以 … 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。 |
(?! re) | 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功。 |
(?> re) | 匹配的独立模式,省去回溯。 |
\w | 匹配数字字母下划线 |
\W | 匹配非数字字母下划线 |
\s | 匹配任意空白字符,等价于 [\t\n\r\f]。 |
\S | 匹配任意非空字符 |
\d | 匹配任意数字,等价于 [0-9]。 |
\D | 匹配任意非数字 |
\A | 匹配字符串开始 |
\Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。 |
\z | 匹配字符串结束 |
\G | 匹配最后匹配完成的位置。 |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。 |
\B | 匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。 |
\n, \t, 等。 | 匹配一个换行符。匹配一个制表符, 等 |
\1…\9 | 匹配第n个分组的内容。 |
\10 | 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。 |
比较常用的标出来了 大写字母在有一对的情况下
大写一般代表取反(非)
小写这代表正常
常用函数
函数名 | 描述 |
---|---|
findall | 匹配所有字符 有返回字符集,无返回空字符集表达式有子组则只能获取到子组对应的内容 re.findall(string[, pos[, endpos]]) |
search | 整个字符串查找一处没有返回None re.search(pattern, string, flags=0) |
sub | 查用于替换字符串的匹配项 默认替换最大值 re.sub(pattern, repl, string, count=0, flags=0) |
subn | 查用于替换字符串的匹配项 默认替换最大值 re.sub(pattern, repl, string, count=0, flags=0) 基本和sub一样 区别在于 返回值中会出现具体替换次数 |
finditer | 匹配的所有子串,并把它们作为一个迭代器返回 re.finditer(pattern, string, flags=0)开始匹配字符串 无返回None |
compile | 生成正则表达式对象 rege对象 re.compile(pattern[, flags]) |
split | split 方法按照能够匹配的子串将字符串分割后返回列表 re.split(pattern, string[, maxsplit=0, flags=0]) |
参数说明 | pattern 正则表达式 replace替换的字符串 string目标字符串 max 最多替换几处,默认替换全部 flags功能标志位,扩 展正则表达式的匹配 返回值:替换后的字符串 |