美文网首页
Python学习

Python学习

作者: 逛逛_堆栈 | 来源:发表于2021-04-12 13:22 被阅读0次

    第十九天

    正则表达式

    正则表达式是一个强大的字符串处理技术,几乎任何和字符串有关的操作都可以使用正则表达式来完成,如果想要去爬取数据,那么正则表达式更是不可或缺的技能。正则表达式的在不同的语言中使用方式可能不一样,不过只要学会了任意一门语言的正则表达式用法,其他语言中大部分也只是换了个函数的名称而已,本质都是一样的。

    1、正则表达式

    1.1、基本符号

    1.点号“.”
    点号可以代替除了换行符(\n)以外的任何一个字符,包括但不限于英文字母、数字、汉字、英文标点符号和中文标点符号;

    2.星号“*”
    一个星号可以表示它前面的一个子表达式(普通字符、另一个或几个正则表达式符号)0次到无限次;

    3.问号“?”
    问号表示它前面的子表达式0次或者1次。注意,这里的问号是英文问号;

    4.反斜杠“\”
    反斜杠在正则表达式里面不能单独使用,甚至在整个Python里都不能单独使用。反斜杠需要和其他的字符配合使用来把特殊符号变成普通符号,把普通符号变成特殊符号;如:“\n”。

    5.数字“\d”
    正则表达式里面使用“\d”来表示一位数字。再次强调一下,“\d”虽然是由反斜杠和字母d构成的,但是要把“\d”看成一个正则表达式符号整体;

    6.小括号“()”
    小括号可以把括号里面的内容提取出来;

    1. ^ 符号
      匹配开始位置,多行模式下匹配每一行的开始;

    2. $符号
      匹配结束位置,多行模式下匹配每一行的结束;

    3. {m,n}
      匹配前一个元字符m到n次;

    1.2、re模块

    在python中,使用正则表达式需要引入re模块,re模块中定义了很多对字符串操作的方法
    re模块核心函数:

    1.2.1、compile()函数

    编译正则表达式pattern,返回正则表达式对象,供 match() 和 search() 这两个函数使用;
    语法:re.compile(pattern[, flags])
    pattern、一个字符串形式的正则表达式
    flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
    1、re.I 忽略大小写;
    2、re.M 多行模式;
    3、re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符);
    4、re.X 为了增加可读性,忽略空格和 # 后面的注释;

    pattern = re.compile(r'\d+') # 用于匹配至少一个数字
    ret = pattern.match('234hjk22lk') # match从开始匹配
    print(ret.group() if ret else '没有匹配数据')  # 234
    
    pattern = re.compile(r'\d+')
    ret = pattern.match('wasd234hjk22lk')
    print(ret.group() if ret else '没有匹配数据')  # 没有匹配数据
    
    1.2.2、match()函数

    从字符串的最开始与pattern进行匹配,匹配成功返回匹配对象(只有一个结果),否则返回None;
    语法:re.match(pattern, string, flags=0)
    pattern、匹配的正则表达式
    string、要匹配的字符串
    flags、是否区分大小写等匹配方式

    ret = re.match('速度与激情\d','速度与激情8')
    print(ret.group() if ret else '没有匹配数据')  # 速度与激情8
    
    ret = re.match('速度与激情[12345679]','速度与激情8')
    print(ret.group() if ret else '没有匹配数据')  # 没有匹配数据
    
    1.2.3、search()函数

    与match()工作的方式一样,但是search()不是从最开始匹配的,而是从任意位置查找第一次匹配的内容。如果所有的字串都没有匹配成功,返回None,否则返回匹配对象;
    语法:re.search(pattern, string, flags=0)

    ret = re.search(r'\d+','wasd12jkl45op')
    print(ret.group() if ret else '没有匹配数据')  # 12
    
    1.2.4、findall()函数

    查找字符串中所有出现的正则表达式模式,并返回一个匹配列表;match 和 search 是匹配一次 findall 匹配所有
    语法:findall(string[, pos[, endpos]])
    1、string : 待匹配的字符串。
    2、pos : 可选参数,指定字符串的起始位置,默认为 0。
    3、endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。

    pattern = re.compile(r'\d{2}\w')
    ret = pattern.findall('www23kkk456ll2k4j5n55b')
    print(ret) # ['23k', '456', '55b']
    
    pattern = re.compile(r'\d{2}\w')
    ret = pattern.findall('www23kkk456ll2k4j5n55b',4,12)
    print(ret) # ['456']
    

    1.3、匹配单个字符

    单字符匹配:
    1、点.:
    点号可以代替除了换行符(\n)以外的任何一个字符;
    2、[]:
    匹配[]中列举的字符;
    3、\d:
    匹配数字;
    4、\D:
    匹配非数字;
    5、\s:
    匹配空白、空格、tab键;
    6、\S:
    匹配非空白;
    7、\w:
    匹配单词字符;
    8、\W:
    匹配非单词字符;

    ret = re.match(r'速度与激情.','速度与激情')
    print(ret.group() if ret else '没有匹配数据') # 没有匹配数据
    
    ret = re.match(r'速度与激情.','速度与激情1')
    print(ret.group() if ret else '没有匹配数据') # 速度与激情1
    
    ret = re.match(r'速度与激情.','速度与激情A')
    print(ret.group() if ret else '没有匹配数据') # 速度与激情A
    
    ret = re.match(r'速度与激情.','速度与激情!')
    print(ret.group() if ret else '没有匹配数据') # 速度与激情!
    

    1.4、匹配多个字符

    1、*
    匹配前一个字符出现>=0次
    2、+
    匹配前一个字符出现>=1次
    3、?
    匹配前一个字符出现1次或者0次
    4、{m}
    匹配前一个字符出现m次
    5、{m,n}
    匹配前一个字符出现m到n次

    ret = re.match('[A-Za-z]*','Ww')
    print(ret.group() if ret else '没有匹配数据') # Ww
    
    ret = re.match('[A-Za-z]+','WwwW')
    print(ret.group() if ret else '没有匹配数据') # WwwW
    
    ret = re.match('[A-Za-z]?','MmMm')
    print(ret.group() if ret else '没有匹配数据') # M
    

    相关文章

      网友评论

          本文标题:Python学习

          本文链接:https://www.haomeiwen.com/subject/ejzmkltx.html