边学边敲边记(一):正则表达式基础入门

一、正则表达式介绍

1.学习爬虫,为什么必须会正则表达式?
  有时候,我们爬取一些网页具体内容时,会发现我们只需要这个网页某个标签的一部分内容,或者是这个标签的 某个属性的值时,用普通的 xpath 或者css.selector是不能实现我们的想法的,这个时候就必须用到正则表达式去匹配获取。
2.正则表达式官方简介?
  正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

二、看代码,边敲边学正则表达式

day01:

'''
author : 极简XksA
date : 2018.7.27
goal : 正则表达式
'''

import re

line = 'jijianXksA123'

# ^a 表示匹配以a开头的字符串(只匹配一次)
# . 表示该字符可为任意字符(只匹配一次)
# * 表示前面的字符可以出现任意次(0次或多次)(多次匹配)
reg_str01 = '^j.*'    # 表示以j开头的字符串
# re.match 函数
# 第一个参数是匹配的格式
# 第二参数是要匹配的字符串
# 返回值为:匹配成功,返回match对象,否则返回:None

if re.match(reg_str01,line) :
    print("匹配成功!")  # reg_str = '^j.*'     匹配成功
else:
    print("匹配失败!")  # reg_str = '^i.*'     匹配失败


# 23$ 表示匹配以23结尾的字符串(只匹配一次)
reg_str02 = '^j.*23$'
if re.match(reg_str02,line) :
    print("匹配成功!")  # reg_str = '^j.*23$'     匹配成功
else:
    print("匹配失败!")  # reg_str = '^j.*13$'     匹配失败


line01 = 'boooboaobxby'
# () 内的为 匹配模式,通过 group函数 可以取出匹配结果
# 正则表达式贪婪匹配模式:从后面(右边)开始匹配
reg_str03 = '.*(b.*b).*'
test01 = re.match(reg_str03,line01)
if  test01:
    print(test01.group(1))      # result : bxb
else:
    print("匹配失败!")

# 正则表达式非贪婪匹配模式:从前面(左边)开始匹配
# ? : 表示从左边开始匹配,匹配到第一个符合模式的内容,即进入模式
#
reg_str03 = '.*?(b.*b).*'   # 半贪婪匹配
reg_str04 = '.*?(b.*?b).*'  # 非贪婪匹配
test01 = re.match(reg_str03,line01)
test02 = re.match(reg_str04,line01)
if  test01 and test02:
    print(test01.group(1))      # result : boooboaobxb
    print(test02.group(1))  # result : booob
else:
    print("匹配失败!")

day02:

'''
author : 极简XksA
date : 2018.7.28
goal : 正则表达式
'''
import re
line01 = 'boooboaobcxby'

def regtest(reg_str,line = line01):
    test = re.match(reg_str, line)
    if test:
        print(test.group(1))
    else:
        print("匹配失败!")

# + :表示前面的字符,至少出现一次
reg_str04 = '.*(b.+b).*'  # (b.+b)表示b与b之间至少有一个字符
regtest(reg_str04)      # result : bcxb

# {n} : 控制前面字符出现次数
# a{2} : 表示a出现两次
# b{3,4} : 表示b至少出现3次,最多出4次
# c{4,} : 表示c至少出现4次
reg_str05 = '.*(b.{2}b).*'  # (b.{2}b)表示匹配到的b与b之间,只有两字符
reg_str06 = '.*(b.{3,4}b).*'  # (b.{3,6}b)表示匹配到的b与b之间,至少有3个字符,至多有4个字符
reg_str07 = '.*(b.{4,}b).*'  # (b.{8,}b)表示匹配到的b与b之间,至少有4个字符
regtest(reg_str05)   # result : bcxb
regtest(reg_str06)   # result : boaob
regtest(reg_str07)   # result : boaobcxb

# | :表示 或
# (abc|123) : 表示匹配到 abc 或者 123,都算匹配成功
reg_str08 = '.*(boo|abc)'
reg_str09 = '.*(abc|boo)'
regtest(reg_str08)   # result : boo
regtest(reg_str09)   # result : boo

# [] : 表示 里面包含的内容都可以进行匹配,包含内容只有表面字符含义
# [abcd] : 表示 只要这个字符为 a/b/c/d中的一个都可以匹配成功
# [0-9] : 表示 只要这个字符在 0-9 这个区间内,都可以匹配成功
# [^x] : 表示匹配 字符不为 x
line02 = '电话号:15573563467'
reg_str10 = '.*(1[3458][0-9]{9}).*'
reg_str11 = '.*(1[3458][^1]{9}).*'
regtest(reg_str10,line02)   # result : 15573563467
regtest(reg_str11,line02)   # result : 15573563467

# \s 表示匹配空格,匹配一次
# \S 表示匹配不是空格的字符,匹配一次
# \w 表示匹配 A-Z、0-9、_ 中的容易字符,匹配一次
# \W 与 \w 相反
# \d 表示数字
# [\u4E00-\u9FA5] : 表示所有汉字,unicode 编码

def regtest_test(reg_str,line = line01):
    test = re.match(reg_str, line)
    if test:
        print(test.group(1)+':'+test.group(2)+'-'+test.group(3)+'-'+test.group(4))
    else:
        print("匹配失败!")

# 简单实例
str01 = '张三出生于1997年12月20日'
str02 = '李四出生于1989-01-20'
str03 = '王五出生于1997/2/5'
str04 = '赵六出生于1997.12.20'
str = [str01,str02,str03,str04]
# 提取出姓名+出生日期
# 匹配模式
reg_str12 = '(.*)出生于(\d{4})[.年/-](\d{1,2})[.月/-](\d{1,2}).*?'
for i in range(4):
    regtest_test(reg_str12,str[i])
# result :
#       张三:1997-12-20
#       李四:1989-01-20
#       王五:1997-2-5
#       赵六:1997-12-20

三、后言

微信搜索: 极简XksA,回复关键字:Scrapy,即可获取某宝价值300多的Scrapy学习教程,从入门到实战。
课程目录


课程目录

微信公众号:极简XksA

猜你喜欢

转载自blog.csdn.net/qq_39241986/article/details/81348755
今日推荐