爬虫之正则表达式
程序员文章站
2022-09-30 23:09:44
1.学习爬虫,为什么必须会正则表达式? 我们爬取一些网页具体内容时,只需要这个网页某个标签的一部分内容就足够,或者是这个标签的某个属性的值时,用普通的 xpath 或者css.selector是不能完成的,此时我们就需用到正则表达式去匹配获取。2.正则表达式官方简介? 正则表达式,又称规则表达式。( ......
1.学习爬虫,为什么必须会正则表达式?
我们爬取一些网页具体内容时,只需要这个网页某个标签的一部分内容就足够,或者是这个标签的某个属性的值时,用普通的 xpath 或者css.selector是不能完成的,此时我们就需用到正则表达式去匹配获取。
2.正则表达式官方简介?
正则表达式,又称规则表达式。(在代码中常简写为regex、regexp或re),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
1 ''' 2 正则表达式 3 ''' 4 5 import re 6 7 line = 'jijianxksa123' 8 9 # ^a 表示匹配以a开头的字符串(只匹配一次) 10 # . 表示该字符可为任意字符(只匹配一次) 11 # * 表示前面的字符可以出现任意次(0次或多次)(多次匹配) 12 reg_str01 = '^j.*' # 表示以j开头的字符串 13 # re.match 函数 14 # 第一个参数是匹配的格式 15 # 第二参数是要匹配的字符串 16 # 返回值为:匹配成功,返回match对象,否则返回:none 17 18 if re.match(reg_str01,line) : 19 print("匹配成功!") # reg_str = '^j.*' 匹配成功 20 else: 21 print("匹配失败!") # reg_str = '^i.*' 匹配失败 22 23 24 # 23$ 表示匹配以23结尾的字符串(只匹配一次) 25 reg_str02 = '^j.*23$' 26 if re.match(reg_str02,line) : 27 print("匹配成功!") # reg_str = '^j.*23$' 匹配成功 28 else: 29 print("匹配失败!") # reg_str = '^j.*13$' 匹配失败 30 31 32 line01 = 'boooboaobxby' 33 # () 内的为 匹配模式,通过 group函数 可以取出匹配结果 34 # 正则表达式贪婪匹配模式:从后面(右边)开始匹配 35 reg_str03 = '.*(b.*b).*' 36 test01 = re.match(reg_str03,line01) 37 if test01: 38 print(test01.group(1)) # result : bxb 39 else: 40 print("匹配失败!") 41 42 # 正则表达式非贪婪匹配模式:从前面(左边)开始匹配 43 # ? : 表示从左边开始匹配,匹配到第一个符合模式的内容,即进入模式 44 # 45 reg_str03 = '.*?(b.*b).*' # 半贪婪匹配 46 reg_str04 = '.*?(b.*?b).*' # 非贪婪匹配 47 test01 = re.match(reg_str03,line01) 48 test02 = re.match(reg_str04,line01) 49 if test01 and test02: 50 print(test01.group(1)) # result : boooboaobxb 51 print(test02.group(1)) # result : booob 52 else: 53 print("匹配失败!")
1 import re 2 line01 = 'boooboaobcxby' 3 4 def regtest(reg_str,line = line01): 5 test = re.match(reg_str, line) 6 if test: 7 print(test.group(1)) 8 else: 9 print("匹配失败!") 10 11 # + :表示前面的字符,至少出现一次 12 reg_str04 = '.*(b.+b).*' # (b.+b)表示b与b之间至少有一个字符 13 regtest(reg_str04) # result : bcxb 14 15 # {n} : 控制前面字符出现次数 16 # a{2} : 表示a出现两次 17 # b{3,4} : 表示b至少出现3次,最多出4次 18 # c{4,} : 表示c至少出现4次 19 reg_str05 = '.*(b.{2}b).*' # (b.{2}b)表示匹配到的b与b之间,只有两字符 20 reg_str06 = '.*(b.{3,4}b).*' # (b.{3,6}b)表示匹配到的b与b之间,至少有3个字符,至多有4个字符 21 reg_str07 = '.*(b.{4,}b).*' # (b.{8,}b)表示匹配到的b与b之间,至少有4个字符 22 regtest(reg_str05) # result : bcxb 23 regtest(reg_str06) # result : boaob 24 regtest(reg_str07) # result : boaobcxb 25 26 # | :表示 或 27 # (abc|123) : 表示匹配到 abc 或者 123,都算匹配成功 28 reg_str08 = '.*(boo|abc)' 29 reg_str09 = '.*(abc|boo)' 30 regtest(reg_str08) # result : boo 31 regtest(reg_str09) # result : boo 32 33 # [] : 表示 里面包含的内容都可以进行匹配,包含内容只有表面字符含义 34 # [abcd] : 表示 只要这个字符为 a/b/c/d中的一个都可以匹配成功 35 # [0-9] : 表示 只要这个字符在 0-9 这个区间内,都可以匹配成功 36 # [^x] : 表示匹配 字符不为 x 37 line02 = '电话号:15573563467' 38 reg_str10 = '.*(1[3458][0-9]{9}).*' 39 reg_str11 = '.*(1[3458][^1]{9}).*' 40 regtest(reg_str10,line02) # result : 15573563467 41 regtest(reg_str11,line02) # result : 15573563467 42 43 # \s 表示匹配空格,匹配一次 44 # \s 表示匹配不是空格的字符,匹配一次 45 # \w 表示匹配 a-z、0-9、_ 中的容易字符,匹配一次 46 # \w 与 \w 相反 47 # \d 表示数字 48 # [\u4e00-\u9fa5] : 表示所有汉字,unicode 编码 49 50 def regtest_test(reg_str,line = line01): 51 test = re.match(reg_str, line) 52 if test: 53 print(test.group(1)+':'+test.group(2)+'-'+test.group(3)+'-'+test.group(4)) 54 else: 55 print("匹配失败!") 56 57 # 简单实例 58 str01 = '张三出生于1997年12月20日' 59 str02 = '李四出生于1989-01-20' 60 str03 = '王五出生于1997/2/5' 61 str04 = '赵六出生于1997.12.20' 62 str = [str01,str02,str03,str04] 63 # 提取出姓名+出生日期 64 # 匹配模式 65 reg_str12 = '(.*)出生于(\d{4})[.年/-](\d{1,2})[.月/-](\d{1,2}).*?' 66 for i in range(4): 67 regtest_test(reg_str12,str[i]) 68 # result : 69 # 张三:1997-12-20 70 # 李四:1989-01-20 71 # 王五:1997-2-5 72 # 赵六:1997-12-20
注:此文来自网络,回归网络