• 正则表达式——语法、re模块的使用(附示例)


    正则表达式是处理字符串的强大工具,它有自己特定的语法结构,可以用来实现字符串的检索、替换、匹配验证。对于爬虫来说,有了它,从HTML里提取想要的信息也是非常的方便。

    • 优点:速度快,效率高,准确度高。

    • 缺点:新手上手难度有点高

    不过只要你掌握了正则编写的逻辑关系,写出一个提取页面内容的正则其实并不复杂。

    1 正则的语法

    使用元字符进行排列组合用来匹配字符串,在线测试正则表达式https://tool.oschina.net/regex/

    模式描述
    \w,等价于[a-zA-Z0-9_] \w可以匹配汉字(python),
    \W匹配不是字母、数字、下划线的其他字符
    \s匹配任意空白字符,等价于(\t\n\r\f)
    \S匹配任意非空字符
    \d匹配数字,等价于[0-9]
    \D匹配不是数字的字符
    \A匹配字符串开头
    \Z匹配字符串结尾的,如果存在换行,只匹配到换行前的结束字符串
    \z匹配字符串结尾的,如果存在换行,匹配到换行符\n
    \G最好完成匹配的位置
    \n匹配一个换行符
    \t匹配一个制表符(tab)
    ^匹配一行字符串的开头
    $匹配一行字符串的结尾
    .匹配任意字符,除了换行符.当re.DOTALL标记被指定时,这可以匹配包括换行符在内的任字符
    […]用来表示一组字符,比如[abc]表示匹配a或b或c,[a-z],[0-9]
    [^…]匹配不在[]里面的字符,比如[^abc]匹配除a,b,c以外的字符
    *匹配0个或多个字符
    +匹配1个或多个字符
    ?匹配0个或1个前面的正则表达式片段,(.*?)表示尽可能少地匹配字符(后面详解)
    {n}精确匹配前面n个前面的表达式,如\d{5}表示匹配5个数字
    {n,m}匹配前面的表达式n到m次,贪婪模式
    ab
    (…)匹配括号里的表达式,也可以表示一个组

    2 re模块

    看完了上面正则表达式语法和匹配的相关介绍,也许会很懵,不用着急。通过下面的介绍示例很快就能掌握。

    在Python中需要通过正则表达式对字符串进⾏匹配的时候,可以使⽤⼀个python自带的模块,名字为re。

    正则表达式的大致匹配过程是:

    1. 依次拿出表达式和文本中的字符比较,
    2. 如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。
    3. 如果表达式中有量词或边界,这个过程会稍微有一些不同。
    2.1 match

    match只能从字符串的开头进行匹配 ,返回的是match对象,匹配不成功则返回None,拿数据需要group()方法。

    re.match(pattern, string, flags=0)

    第一个参数传入正则表达式,第二个参数传入要匹配的字符串

    import re
    content='hello 123 python!'
    result=re.match('h',content)
    print(result)
    print(result.group())
    #运行结果
    <re.Match object; span=(0, 1), match='h'>
    h
    ------
    content='hello 123 python!'
    result=re.match('123',content)
    print(result)
    #运行结果
    None
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    2.2 search

    检查字符串的任意位置,匹配到了第一个结果,就会返回这个结果,如果匹配不上search返回的则是None。

    import re
    content='hello 123 python!'
    result=re.search('123',content)
    print(result)
    print(result.group())
    #运行结果
    <re.Match object; span=(6, 9), match='123'>
    123
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    2.3 findall

    findall查找所有,返回list。

    示例:查找字符串中所有的副词

    import re
    text = "He was carefully disguised but captured quickly by police."
    rule="\w+ly"   # 匹配规则,\w匹配字母、数字、下划线,+与前面相连用来匹配多个字母
    result=re.findall(rule, text)
    print(result)
    #运行结果
    ['carefully', 'quickly']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    2.4 sub

    除了使用正则表达式提取信息外,有时候还可以借助它来修改文本。

    sub(pattern, repl, string, count=0, flags=0)

    通过使用 repl 替换在 string 最左边非重叠出现的 pattern 而获得的字符串。 如果样式没有找到,则不加改变地返回 string。

    示例:删除文本中所有的数字

    import re
    text = "24he234l234lo 65p23y23t234ho7n"
    result=re.sub("\d+","",text)
    print(result)
    #运行结果
    hello python
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    2.5 compile

    这个方法可以将正则字符串编译成正则表达式对象,以便在后面的匹配中复用。

    prog = re.compile(pattern)
    result = prog.match(string)
    #等价于
    result = re.match(pattern, string)
    
    • 1
    • 2
    • 3
    • 4

    下面在补充一个finditer方法,返回的是迭代器 从迭代器中拿到内容需要.group()

    obj = re.compile(r"\d+")  #多个地方进行使用
    ret= obj.finditer("我的电话是:10086,我女朋友的电话是:10010")
    for i in ret:
        print(i.group())
    #运行结果
    10086
    10010
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3 实战注意事项

    3.1 贪婪与非贪婪

    惰性匹配 .*? 当出现多给匹配结果时 选尽可能少的结果 让星号尽可能少的出现结果 。

    贪婪匹配 .* 与惰性相反,让星号尽可能多的出现结果 。

    3.2 标志修饰符

    正则表达式可以包含一些可选标志修饰符,来控制匹配的模式。

    修饰符描述
    re.I使匹配对大小写不敏感
    re.L做本地化识别(locale-aware)匹配
    re.M多行匹配,影响 ^ 和 $
    re.S使 . 匹配包括换行在内的所有字符
    re.U根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
    re.X该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
    import re
    text="""http:\\PYTHON.org very good
    """
    result=re.match(r'^http.*?(py\w+).*?good',text)
    print(result)
    # 运行结果
    None
    ------
    # 添加修饰符
    text="""http:\\PYTHON.org very good
    """
    result=re.match(r'^http.*?(py\w+).*?good',text,re.I)
    print(result)
    # 运行结果
    <re.Match object; span=(0, 26), match='http:\\PYTHON.org very good'>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    3.3 原始字符串表示法

    正则表达式用反斜杠字符 ('\') 表示特殊形式,或是允许在使用特殊字符时,不引发它们的特殊含义。 这与 Python 的字符串字面值中对相同字符出于相同目的的用法产生冲突;例如,要匹配一个反斜杠字面值,用户可能必须写成 '\\\\' 来作为模式字符串,因为正则表达式必须为 \\,而每个反斜杠在普通 Python 字符串字面值中又必须表示为 \\

    解决办法是对于正则表达式样式使用 Python 的原始字符串表示法;在带有 'r' 前缀的字符串字面值中,反斜杠不必做任何特殊处理。 因此 r"\n" 表示包含 '\''n' 两个字符的字符串,而 "\n" 则表示只包含一个换行符的字符串。 样式在 Python 代码中通常都使用原始字符串表示法。

    import re
    text='http:\\python.org'
    result=re.search('\\\\python',text)
    print(result)
    # 运行结果
    <re.Match object; span=(5, 12), match='\\python'>
    ------
    text='http:\\python.org'
    result=re.search(r'\\python',text)  #差异点
    print(result)
    #运行结果
    <re.Match object; span=(5, 12), match='\\python'>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    PID控制算法学习笔记分享
    (02)Cartographer源码无死角解析-(26) 阻塞队列BlockingQueue(),与OrderedMultiQueue成员函数
    MessageBox的模版语法上如何注册事件
    安徽省图书馆典藏《乡村振兴振兴战略下传统村落文化旅游设计》许少辉八一新著
    Python数据结构(顺序表)
    WebServer(Nginx、Httpd、IIS)搭建Http文件服务
    华为eNSP配置防火墙策略
    Nginx配置文件中,如何配置启用SignalR
    深度学习使用Keras进行迁移学习提升网络性能
    PostgreSQL 17即将发布,新功能Top 3
  • 原文地址:https://blog.csdn.net/baidu_39621090/article/details/126403781