正则表达式
正则表达式(Regular Expression)是一段字符串,它可以表示一段有规律的信息,Python自带一个正则表达式模块,通过这个模块可以查找,提取,替换一段有规律的信息。
在程序开发中,要让计算机从一大段文字中找到需要的文本内容,就需要使用到正则表达式来实现。使用正则表达式。有如下步骤。1.寻找规律 2.使用正则符号表示规律 3.提取信息。
一、正则表达式的基本符号
1.点号" . "
点号:可以代表任何除了换行符(
)以外 的字符
一个点代表一个字符
点号就事宜个占位符(和%s有异曲同工之处)
2.星号 " * "
星号更有意思了,星号可以代表前面的一个子表达式0次到∞次
举个例子:xixihahahhahhaha -> xixi.* #xixi后面有12 个点 代表字符
xixiaaaaaaaaaaaa-> xixi.* # 代表前面的a
星号和点号都可以标识前面的字符,星号可以标识中间任意多个除了换行符意外的任意字符。
3.问号 " ? "
问号标识它前面的子表达式0次或者1次的。
注意:这里问号是英文问号。
使用反斜杠以后,反斜杠和它后面的一个字符构成一个整体,因此应该将" "看成一个字符,而不是两个字符。
4.反斜杠 " "
反斜杠在正则表达式里面不能单独使用,甚至在整个python里都不能单独使用。反斜杠需要和其他的字符配合使用来把特殊字符号变成普通符号。
常见的字符转义
转义字符 | 意义 |
---|---|
换行符 | |
制表符 | |
普通的反斜杠 | |
’ | 单引号 |
" | 双引号 |
d | 数字 |
5.数字 " d "
正则表达式里面使用“d”来表示一位数字,“d”虽然是由反斜杠和字母d构成的,但是要把“d”看成睁着表达式
提取数字示例:
↑↑点击文字即可查看↑↑
6.小括号 “( )”
从一段文字中提取一部分内容就需要使用到小括号了。
括号使用示例:
↑↑点击文字即可查看↑↑
二、在python中正则表达式的使用
python已经自带了一个功能强大的正则表达式模块,使用这个模式可以非常方便的通过正则表达式来从一段文字中提取有规律的信息。
python中正则表达式的模块是 re 在python中先导入模块,然后使用这个模块
import re
1.dfindall
findall(pattern, string, flags=0)
对 string 返回一个不重复的 pattern 的匹配列表, string 从左到右进行扫描,匹配按找到的顺序返回。如果样式里存在一到多个组,就返回一个组合列表;就是一个元组的列表(如果样式里有超过一个组合的话)。空匹配也会包含在结果里。
在 3.7 版更改: 非空匹配现在可以在前一个空匹配之后出现了。
re.finditer(pattern, string, flags=0)
pattern 在 string 里所有的非重复匹配,返回为一个迭代器 iterator 保存了 匹配对象 。 string 从左到右扫描,匹配按顺序排列。空匹配也包含在结果里。
2.search
re.search(pattern, string, flags=0)
扫描整个 字符串 找到匹配样式的第一个位置,并返回一个相应的 匹配对象。如果没有匹配,就返回一个 None ; 注意这和找到一个零长度匹配是不同的
3.“.”和“.*?”的区别
“ . * ”:贪婪模式,获取最长的满足条件的字符串
“ .? ”:非贪婪模式:获取最短能满足条件的字符串
注意事项:
?, +?, ??
'’, ‘+’,和 ‘?’ 修饰符都是 贪婪的;它们在字符串进行尽可能多的匹配。有时候并不需要这种行为。如果正则式 <.> 希望找到 ’ b ',它将会匹配整个字符串,而不仅是 ‘’。在修饰符之后添加 ? 将使样式以 非贪婪方式或者 :dfn:
最小 方式进行匹配; 尽量 少 的字符将会被匹配。 使用正则式 <.*?> 将会仅仅匹配 ‘’。
三、正则表达式的提取技巧
1.不需要complie
re.compile简介:
re.compile(pattern, flags=0)
将正则表达式的样式编译为一个 正则表达式对象 (正则对象),可以用于匹配,通过这个对象的方法 match(), search() 以及其他如下描述。
这个表达式的行为可以通过指定 标记 的值来改变。值可以是以下任意变量,可以通过位的OR操作来 结合( | 操作符)。
序列
prog = re.compile(pattern)
result = prog.match(string)
等价于
result = re.match(pattern, string)
如果需要多次使用这个正则表达式的话,使用 re.compile() 和保存这个正则对象以便复用,可以让程 序更加高效。
注解 :通过 re.compile() 编译后的样式,和模块级的函数会被缓存, 所以少数的正则表达式使用无需考虑编译的问题。
在使用re.compile()的时候,程序的内部调用的是_complime()方法,当时用re.finall的时候,在模块内部自动先调用了_compile()这个方法,再调用findall()方法。re.findall()自带re.compile()功能,没必要使用re.compile()方法。
2.先抓大在抓小
有效内容和无效内容混杂在一起,需要解决这个问题就需要使用先抓大再抓小的技巧,先把有效的信息整体匹配进来,但从有效用户里面匹配出人民。先抓大再抓小思想会贯穿整个爬虫开发过程。
3.括号内和括号外
我括号里面有其他普通字符,那么这些普通字符就会出现在获取的结果里面。举个例子,如果说“左手和右手之间”一般指的是躯干这一部分,如果说“左手和右手之间包括左手和右手”,那么就是指整个人儿把普通字符放在括号里面,就表示结果中需要包含他们。
附python讲解视频链接:
详解Python正则表达式