虽然BeautifulSoup能帮助我们完成大部分的工作,但是我们还是有必要了解一下正则表达式的产生过程与基本规则的。
在学习正则之前呢,我问了自己几个问题,下面的回答都是我自己的体会或者看别人的文章的启发。
Q : 什么是正则表达式?
** 1、正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串 替换 , 或者 从某个串中 取出 符合某个条件的子串等。
** 2、又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
我们可以吧正则表达式比喻成一个 数学代数公式,现在你面前是一串由1000万个无序数字组成的数字串,我要让你从这个1000万个数字中找到一段或多段能使刚刚那个数学代数式成立的数字。
估计以人类的力量,找半年也找不完吧,但是在程序中实现正则表达式的话,他能在很短的时间内匹配到我们想要数据。
Q : 他有什么用?
正则表达式主要是针对字符串进行操作,可以简化对字符串的复杂操作,其主要功能有匹配、切割、替换、获取。正则表达式一定有很多用途,
但是就目前,我只用过正则来分析HTML网页,从网页代码中匹配到我自己想要的东西。比如在一个包含很多超链接的网页中,把所有的超链接匹配出来。
Q : 只有python才有正则表达式吗?
几乎都可以用,我只能说几乎,使用正则表达式时,他们的基本规则时一样的,有的可能会有扩展。
不同的语言(如PHP和JAVA)、相同语言的不同类库(如来自Sun的Java Regular Expression类库跟Apache Jakarta的正则表达式类库)间,用法会有所差别,在使用的时候,要注意这些差别。
在python中,我们可以通过导入re库,来使用正则表达式。
好了,那么先体验一下正则表达式到底有什么强大的地方:http://tool.oschina.net/regex/#
正则表达式常用规则:
/*********************************
\w匹配字母数字及下划线
\W匹配非字母数字及下划线
\s匹配任意空白字符,等价于 [\t\n\r\f].
\S匹配任意非空字符
\d匹配任意数字,等价于 [0-9]
\D匹配任意非数字
\A匹配字符串开始
\Z匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串
\z匹配字符串结束
\G匹配最后匹配完成的位置
\n匹配一个换行符
\t匹配一个制表符
^匹配字符串的开头
$匹配字符串的末尾。
.匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...]用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...]不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
*匹配0个或多个的表达式。
+匹配1个或多个的表达式。
?匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
{n}精确匹配n个前面表达式。
{n, m}匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a|b匹配a或b
( )匹配括号内的表达式,也表示一个组
/*********************************************
在python中使用正则表达式时需要注意的地方:
1、在网页匹配中,最好使用修饰符 re.S 使正则表达式可以匹配节点与节点之间的换行。
修饰符描述:
re.I使匹配对大小写不敏感
re.L做本地化识别(locale-aware)匹配
re.M多行匹配,影响 ^ 和 $
re.S使 . 匹配包括换行在内的所有字符
re.U根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
在网页匹配中较为常用的为re.S、re.I。
2、
贪婪匹配: .* 匹配尽可能多的字符,一般常用在表达式的结尾
非贪婪匹配: .*? 匹配尽可能少的字符,用在中间。
3、转义匹配
当需要匹配的字符串中包含正则表达式定义的特殊字符时,在正则表达式中使用转义字符来进行区别。具体使用和C语言中一样。前面加反斜杠
4、match 和 search
match:从字符串的起始位置开始匹配,如果匹配,返回匹配结果,失败返回None
search:扫描整个字符串,返回第一个匹配成功的内容。失败返回None
大部分情况下,为了使用方便,都是用search
5、findall 获取所有匹配的内容
该方法返回一个 list,list的每个元素都是 tuple 类型。然后遍历整个list即可输出每个匹配的内容。
results = re.findall('<li.*?>\s*?(<a.*?>)?(\w+)(</a>)?\s*?</li>', html, re.S)
for result in results:
print(result[1])
6、sub :匹配并替换文本,返回替换后的文本
比如去掉一个字符串中的所有数字:
content = '54aK54yr5oiR54ix5L2g'
content = re.sub('\d+', '', content)
print(content)
就是先匹配出所有的数字,然后用空来替代即可。
利用这个技巧,可以先把一个HTML文本中的大部分无关的东西去掉,然后在进行匹配,可以方便很多。
7、compile :可以将正则表达式的字符串编译成正则表达式对象,方便后面多次使用。相当于给正则表达式做了一层封装。
8、使用group对正则表达式分组的时候,参数0对应整个匹配到的字符串,参数1才对应第一个分组。
参考资料:
https://blog.csdn.net/qq_878799579/article/details/72887612
https://www.cnblogs.com/luoshufang/p/5685784.html