正则表达式(和JavaScript等语言共通)
正则表达式就是对一些字符的匹配,查询,获取的优化,使之更加简单,但是在这种优化强度下,它又及其复杂,特性,需要记得的东西很多的说
一, 导入Re库
由于re库是下载安装完python自带的,所以无需再下载
# 如果没有,则需要先下载
1 pip3 install re
1 import re
二,方法
就目前来讲,re最常用的三种方法
-
- match()
- search()
- findall()
首先,match() 方法就是从开头开始查找,若是第一个首字符以及后面的不是所要匹配的内容,则会返回None
其次,search() 方法就相对之广多了,它是对 整个要匹配的String进行检索
当然,findall)() 顾名思义,就是对所有内容进行检索,并且返回字符串数组
对了,三个方法的参数均为
pattern, string, flags=0
pattern ==> 要匹配的内容
string ==> 被匹配的字符串
flags ==> 匹配方式
现在来一一,细说。
首先来说 flags(当然只记录常用的喽)
- re.I 忽略大小写
- re.M 多行匹配,影响边界字符 ^ 和 $
- re.X 使得我们以更灵活的方式理解正则表达式
- re.S 匹配包括换行符号在内的所有字符
- .......
其次,最多的就是 pattern 这些元字符了
- [0123456789] 匹配0-9所有的数字
- [0-9a-zA-Z] 匹配任意的数字,字母,下划线
- [^sunck] 匹配除了 sunck 这几个字母以外的所有字母
- [d] 匹配0-9所有的数字
- [D] 匹配非数字字符,效果同[^0-9]
- [w] 匹配数字,下划线,字母,并且能匹配汉字
- [W] 匹配非数字,下划线,字母
- [s] 匹配任意的空白符,空格,换行,换页,制表,回车
- [S] 匹配任意的非空白符号,效果同[^ f ]
关于其中的注意项
中括号中的 ^ 是非的意思,表示不匹配集合种的字符
后字母的大写是小写的非的意思,表示..........
补充方法
match, search 方法后接 .span 可以返回匹配的内容在字符串中的位置下标
代码示范:
1 print(re.match("[^sunck]", "sunck is a good man")) 2 # None 3 print(re.search("[^sunck]", "sunck is a good man")) 4 # match: " ", span=(5, 6) 5 print(re.search("[^sunck]", "sunck is a good man").span()) 6 # (5, 6) 7 print(re.findall("[d]", "39abc4")) 8 # ['3', '9', '4']
接下来的都算补充内容8
补充:边界字符
- ^ 行首匹配
- $ 行尾匹配
- A 字符串开始匹配,区别于 ^
- 首先,它匹配的是整个字符串的首位置, 而 ^ 是一行的行首
- 同时,这也意味着,当 flags = re.M 多行匹配时,^ 是可以同时匹配多行行首的,而 $ 却不行
- 字符串结束位置匹配(区别于 $)
- 匹配一个单词的边界
- B 匹配非单词边界
1 print(re.search("^sunck", "sunck is a good man")) 2 # <re.Match object; span=(0, 5), match='sunck'> 3 print(re.search("sunck$", "sunck is a good man sunck")) 4 # <re.Match object; span=(20, 25), match='sunck'> 5 print(re.search("^sunck", "is a good man sunck")) 6 # None
边界字符不是加在 [] 里的
1 # B比较 2 print(re.search(r"er", "never")) 3 # <re.Match object; span=(3, 5), match='er'> 4 print(re.search(r"er", "nerve")) 5 # None 6 print(re.search("erB", "never")) 7 # None 8 print(re.search("erB", "nerve")) 9 # <re.Match object; span=(1, 3), match='er'> 10 这就是两者间的区别