正则re模块--入门
本文来源:https://www.cnblogs.com/dyfblog/p/5880728.html
对字符串操作
1、应用:
当我们爬取的东西在js文件中,比如我爬今日头条美女的图片时,它的图片url,就在js中。
当我们处理普通的txt文本时。比如读取log日志
创建一个匹配Email的正则表达式
用该正则表达式去匹配用户的输入来判断是否合法
2、常用的正则
中文 [\u4e00-\u9fa5]
url ^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$
匹配首尾空白字符的正则表达式 ^\s*|\s*$
匹配空白行的正则表达式 \n\s*\r
3.元字符
. 匹配任意字符(不包括换行符)包含空白符
^ 匹配开始位置,多行模式下匹配每一行的开始
$ 匹配结束位置,多行模式下匹配每一行的结束
* 匹配前一个元字符0到多次
+ 匹配前一个元字符1到多次
? 匹配前一个元字符0到1次
{n} 匹配前面元字符n次
{m,n} 匹配前一个元字符m到n次
\d 匹配一个数字, 相当于 [0-9]
\D 匹配非数字,相当于 [^0-9]
\s 匹配任意空白字符, 相当于 [ \t\n\r\f\v]
\S 匹配非空白字符,相当于 [^ \t\n\r\f\v]
\w 匹配数字、字母、下划线中任意一个字符, 相当于 [a-zA-Z0-9_]
\W 匹配非数字、字母、下划线中的任意字符,相当于 [^a-zA-Z0-9_]
\\ 转义字符,跟在其后的字符将失去作为特殊元字符的含义,例如\\.只能匹配.,不能再匹配任意字符
[] 字符集,一个字符的集合,可匹配其中任意一个字符
| 逻辑表达式 或 ,比如 a|b 代表可匹配 a 或者 b
(...) 分组,默认为捕获,即被分组的内容可以被单独取出,默认每个分组有个索引,从 1 开始,按照"("的顺序决定索引值
\A 匹配字符串开始位置,忽略多行模式
\Z 匹配字符串结束位置,忽略多行模式,就是如果最后换行了,他会匹配换行前的字符。
\b 匹配位于单词开始或结束位置的空字符串
\B 匹配不位于单词开始或结束位置的空字符串
\n 匹配一个换行符
\t 匹配一个制表符
(?:...) 分组的不捕获模式,计算索引时会跳过这个分组
(?P<name>...) 分组的命名模式,取此分组中的内容时可以使用索引也可以使用name
(?P=name) 分组的引用模式,可在同一个正则表达式用引用前面命名过的正则,和下面这个一起用
(?(id/name)yes|no) 若前面指定id或name的分区匹配成功则执行yes处的正则,否则执行no处的正则
4、模式
re.S DOTALL,此模式下 '.' 的匹配不受限制,可匹配任何字符,包括换行符
re.I IGNORECASE, 忽略大小写的匹配模式
re.M MULTILINE,多行模式, 改变 ^ 和 $ 的行为
re.X VERBOSE,冗余模式, 此模式忽略正则表达式中的空白和#号的注释,例如写一个匹配邮箱的正则表达式
正则表达式的模式是可以同时使用多个的,在 python 里面使用按位或运算符 | 同时添加多个模式
如 re.compile('', re.I|re.M|re.S)
5.内置对象
SRE_Pattern 这个对象是一个编译后的正则表达式,编译后不仅能够复用和提升效率,同时也能够获得一些其他的关于正则表达式的信息
属性:
- flags 编译时指定的模式
- groupindex 以正则表达式中有别名的组的别名为键、以该组对应的编号为值的字典,没有别名的组不包含在内。
- groups 正则表达式中分组的数量
- pattern 编译时用的正则表达式
SRE_Match 这个对象会保存本次匹配的结果,包含很多关于匹配过程以及匹配结果的信息
属性:
- endpos 本次搜索结束位置索引
- lastgroup 本次搜索匹配到的最后一个分组的别名
- lastindex 本次搜索匹配到的最后一个分组的索引
- pos 本次搜索开始位置索引
- re 本次搜索使用的 SRE_Pattern 对象
- regs 列表,元素为元组,包含本次搜索匹配到的所有分组的起止位置
- string 本次搜索操作的字符串
group([group1, ...]) 根据提供的索引或名字返回响应分组的内容,默认返回 start() 到 end() 之间的字符串, 提供多个参数将返回一个元组
groupdict([default=None]) 返回 返回一个包含所有匹配到的命名分组的字典,没有命名的分组不包含在内,key 为组名, value 为匹配到的内容,参数 default 为没有参与本次匹配的命名分组提供默认值
groups([default=None]) 以元组形式返回每一个分组匹配到的字符串,包括没有参与匹配的分组,其值为 default
6、常用
.*会尽量匹配的多,直到匹配不到为止
.*?就是说非贪婪,只要能不匹配,他就不匹配。
加了re.S,.就可以匹配任意包括换行
7、函数
re.compile(pattern, flags=0) :预编译,复用,regex
给定一个正则表达式 pattern,指定使用的模式 flags 默认为0 即不使用任何模式,(也可以加上re.S等模式)然后会返回一个 SRE_Pattern regex = re.compile(".+"),
这个对象可以调用其他函数来完成匹配,一般来说推荐使用 compile 函数预编译出一个正则模式之后再去使用,这样在后面的代码中可以很方便的复用它,当然大部分函数也可以不用 compile 直接使用。
re.findall(pattern, string, flags=0),也可以用regex.findall()调用
参数 pattern 为正则表达式, string 为待操作字符串, flags 为所用模式,函数作用为在待操作字符串中寻找所有匹配正则表达式的字串,返回一个列表,如果没有匹配到任何子串,返回一个空列表。
re.match()和re.search(),也可以regex.match调用,尽量用search
match(pattern, string, flags=0) ,从字符串开始处开始,寻找可以匹配上模式的子串, 返回匹配上的第一个字串,并且不再继续找,如果开始处不匹配,则不再继续寻找,找不到时返回 None。match(pattern, string, flags=0) 返回值为 一个 SRE_Match 对象。
search(pattern, string, flags=0) 函数类似于 match,不同之处在于不限制正则表达式的开始匹配位置,返回值为 一个 SRE_Match 对象。
8.分组
捕获分组和不捕获分组:差别就是,是否缓存
下面的例子来自知乎:要在一篇文章中查找"program"和"project"两个单词,正则表达式可表示为/program|project/,也可表示为/pro(gram|ject)/,但是缓存子匹配(gramject)没有意义,就可以用/pro(?:gram|ject)/进行非捕获性匹配这样既可以简洁匹配又可不缓存无实际意义的字匹配。 作者:冰冻三寸