Python爬虫学习第三章-2.1-正则基础知识

it2024-04-02  63

Python爬虫学习第三章-2.1-正则基础知识

  这一节主要是介绍正则 (正则的语句可以在http://tool.chinaz.com/regex上运行尝试)

1、正则表达式概述(Regular Expression):

  简成为re,实际上就是一种逻辑公式,一般使用正则表达式对字符串进行匹配和过滤。

  正则表达式由普通字符和元字符组成。普通字符包括大小写字母、数字、下划线等,在匹配普通字符的时候我们直接写就可以了,比如"abc"匹配的就是"abc",元字符才是灵魂。(普通字符匹配的时候注意空白字符,比如回车)。

2、元字符:

字符组:   例如[abc]bc匹配的是‘abc’、‘bbc’、‘cbc’,中括号表示其中任意的一个,成为字符组。中括号表示的是一位,即前面的这一位可以是abc其中之一.   [a-zA-Z]bc是指第一位可以是大小写字母中的任意一个。 第2、3位必须是bc。   [a-zA-Z]bc[0-9]表示第一位必须是大小写字母中的一个,第二位和第三位必须是bc,第四位是0~9其中的一个。

简单元字符:

``` . ——》匹配换行符以外的任意字符,一个点匹配的是一个字符,一个信息;如果想单独匹配个'.'时,可以用\. \w ——》匹配的是字母、数字、下划线 \s ——》匹配任意的空白符,空格、tab和回车等 \d ——》匹配的是数字,0~9 \n ——》匹配的是一个换行符 \t ——》匹配一个制表符 \b ——》匹配的是以指定字母组合结尾的单词的结尾(最后一个字母),比如y\b匹配的就是以y结尾的单词的结尾,jay\b匹配的就是以ja结尾的单词的结尾, ^ ——》匹配字符串的开始,比如:用\d匹配'kevin身高182.6'这个字符串,会匹配到1、8、2、6,但如果是^\d,则不会匹配到内容。检测字符串是不是以特定形式的内容开头 $ ——》匹配字符串的结尾,用法与‘^’相反,比如:^\w$匹配的可以是b,但匹配不了bc,也就是只能匹配以字母数字下划线开头,中间只能是一位,再以字母数字下划线结尾。 ^和$的组合可以强制规定二者中间的数据格式 \W ——》匹配任何非单词字符。等价于 '[^A-Za-z0-9_]',非字母、数字、下划线 \D ——》匹配非数字 \S ——》匹配非空白符 a|b——》匹配字符a或者字符b () ——》匹配括号内的表达式,也表示一个组 [...] ——》匹配字符组中的字符,用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k' [^...] ——》匹配除了字符组中字符的所有字符,不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。 量词表示前边的东西出现的次数: re* ——》重复0次或多次;匹配0个或多个的表达式。 re+ ——》重复一次或多次;匹配1个或多个的表达式。 re? ——》重复0次或1次;匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 re{ n} ——》重复n次;匹配n个前面表达式。例如,"o{2}"不能匹配"Bob"中的"o",但是能匹配"food"中的两个o。 re{ n,} ——》重复n次或更多次;精确匹配n个前面表达式。例如,"o{2,}"不能匹配"Bob"中的"o",但能匹配"foooood"中的所有o。"o{1,}"等价于"o+"。"o{0,}"则等价于"o*"。 re{ n, m} ——》重复n到m次;匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 ```

  案例:

```python 匹配日期:\d{4}(\-|\/|.)\d{1,2}\1\d{1,2} \1表示随动 匹配邮箱:\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14} ``` 贪婪匹配和惰性匹配:   kevin(.*):是指贪婪匹配,匹配尽可能多的内容,用括号括起.*可以使后面的内容成为一组,便于获取;惰性匹配就是re.*? ,尽可能少的匹配。

   .*?a:ouhiuhliilhih不能匹配,但是可以匹配jhkihihoahloiuhiba,因为里面有a。

3、re模块常用函数练习

import re #提取出python key1 = "javapythonphpcgo" result1 = re.findall('python',key1)[0] #findall返回一个列表,[0]是指取第一个元素 print(result1) #提取出hello world key2 = "<html><h1>hello world<h1></html>" result2 = re.findall('<h1>(.*)<h1>',key2)[0] print(result2) #提取出166 key3 = "我喜欢身高166的女生" result3 = re.findall('\d+',key3) print(result3) #提取出http://和https:// key4 = "http://www.baidu.com and https://boob.com" result4 = re.findall('https?://',key4) print(result4) #提取出hello key5 = "lalala<hTmL>hello<HtMl>hahaha" result5 = re.findall('<[Hh][Tt][Mm][Ll]>(.*)<[Hh][Tt][Mm][Ll]>',key5) print(result5) #提取hit key6 = 'bobo@hit.edu.com' result6 = re.findall('h.*?\.',key6) print(result6) #提取sas和saas key7 = 'saas and sas and saaas' result7 = re.findall('sa{1,2}s',key7) print(key7)

输出结果如下: python hello world [‘166’] [‘http://’, ‘https://’] [‘hello’] [‘hit.’] saas and sas and saaas

最新回复(0)