zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Python 编程 | 连载 24 - 正则表达式

2023-06-13 09:11:06 时间

一、正则表达式

认识正则表达式

正则表达式是一个特殊的字符序列,便于检查字符串是否与某种模式匹配,正则表达式也是对字符串的处理,通过定义一个规则,使得从字符串中匹配出符合规则的字符串,正则表达式可以

  • 判断一个字符串是否符合规则,如手机号邮箱判断等
  • 取出指定数据
  • 匹配指定格式的信息

正则表达式通用性强,可适用于很多编程语言

正则表达式匹配字符

正则表达式匹配字符串需要的条件:

  • re模块
  • 匹配规则
  • 匹配范围,既从哪个字符串中尽心匹配

正则表达式中的特殊字符

特殊字符

描述

\d

匹配任何十进制的数字,与[0-9]一致

\D

匹配任意非数字

\w

匹配任何字母数字下划线字符

\W

匹非字母数字以及下划线

\s

匹配任何空格字符,与[\n\t\r\v\f]相同

\S

匹配任意非空字符

\A

匹配字符串的起始

\Z

匹配字符串的结束I

.

匹配任何字符,除\n之外

import re

data = 'I am Thor Odinson, 1500 years old'

print('匹配到的数字为:{}'.format(re.findall('\d', data)))

print('匹配到的空格为:{}'.format(re.findall('\s', data)))

print('匹配到的字符为:{}'.format(re.findall('\w', data)))

print('匹配起始字符串:{}'.format(re.findall('\AI am', data)))

print('匹配末尾字符串:{}'.format(re.findall('old\Z', data)))

print('匹配任何字符:{}'.format(re.findall('.', data)))

使用正则表达式定义函数,操作字符串

import re


def contain_num(data):
    res = re.findall('\d', data)
    if len(res) > 0:
        return True
    return False


def delete_num(data):
    # 匹配出非数字
    res = re.findall('\D', data)
    return ''.join(res)


if __name__ == '__main__':
    data = '95 Anzan Hwy, Ashforad SA 5035 Adelaide'
    contain = contain_num(data)
    print(contain)
    _data = delete_num(data)
    print(_data)

使用正则表达式实现startwith函数和endwith函数

import re


def starts_with(start, data):
    # 构造正则表达式
    _start = '\A%s' % start
    res = re.findall(_start, data)
    if len(res) > 0:
        return True
    return False


def ends_with(end, data):
    _end = '{}\Z'.format(end)
    res = re.findall(_end, data)
    if len(res) > 0:
        return True
    return False


if __name__ == '__main__':
    data = '13 Ramel Way, Pakenham VIC'
    res_01 = starts_with('13', data)
    res_02 = starts_with('afeae', data)
    res_03 = ends_with('VIC', data)
    print(res_01)
    print(res_02)
    print(res_03)

二、正则表达式的量词与组

正则表达式中的符号

  • |:或的意思,re1|re2表示匹配表达式1或者表达式2
  • ^:匹配字符串的开头
  • $:匹配字符串的结尾
  • *:匹配0次或者多次前面出现的正则表达式
  • +:匹配1次或者多次前面出现的正则表达式
  • {N}:匹配N次前面出现的正则表达式
  • {M,N}:匹配M~N次前面出现的正则表达式
  • [...]:匹配来自字符集的任意单一字符
  • [x-y]:匹配x~y范围内的单一字符
  • [^..]:不匹配此字符集中出现的任何一个字符,包括某一范围内的字符
  • \:将特殊字符转义

正则表达式中()表示在匹配规则中获取指定的数据

贪婪与贪婪,0或者多次属于贪婪模式,可以通过?组合变成非贪婪模式

三、正则表达式模块

正则表达式模块的常用方法有:

方法    

描述

findall(pattern, string[,flags])

查找字符串中所有非重复出现的正则表达式模式,返回一个列表

search(pattern, string, flags=0)

使用可选标记搜索字符串中第一次出现的正则表达式模式,如果匹配成功返回匹配对象,否则返回None

group(num)

返回整个匹配对象,或者编号为num的特定子组

groups()

返回一个包含所有匹配子组的元素,如果没有成功匹配,返回一个空元祖

split(pattern, string, max=0)

根据正则表达式的模式分隔符,split函数可以将字符串分割为列表,然后返回成功匹配的列表,分割最多操作max次

match(pattern, string, flags=0)

尝试使用带有可选标记的正则表达式的模式来匹配字符串,匹配成功返回匹配对象,否则返回None

complie(pattern, flags=0)

定义一个匹配规则的对象

import re

def identity(url):
    re_obj = re.compile('[a-zA-Z]{4,5}://\w*.*\w+.\w+')
    print(re_obj)
    res = re_obj.findall(url)
    if len(res) != 0:
        return True
    return False

def get_url(url):
    re_obj = re.compile('[https://|http://](\w*.*\w+.\w+)')
    res = re_obj.findall(url)
    if len(res) != 0:
        return res[0]
    else:
        return False


def get_email(email):
    re_obj = re.compile('.+@.+.[a-zA-Z]+')
    res = re_obj.findall(email)
    return res


def get_html_data(data):
    re_obj = re.compile('style="(.*?)"')
    res = re_obj.findall(data)
    return res

def get_all_data_html(data):
    re_obj = re.compile('="(.+?)"')
    res = re_obj.findall(data)
    return res


if __name__ == '__main__':
    result = identity('http://www.baidu.com/')
    print(result)
    result = get_url('https://www.baidu.com/')
    print(result)
    result = get_email('thor@asgard.com')
    print(result)

    html = ('<div class="s-top-nav" style="display:none;">'
        '</div><div class="s-center-box"></div>')

    result = get_html_data(html)
    print(result)
    result = get_all_data_html(html)
    print(result)
    re_g = re.compile(('<div class="(.*?)" style="(.*?)">'
                       '</div><div class="(.*?)"></div>'))
    result = re_g.search(html)
    print(result.groups())
    print(result.group(1))
    print(result.group(2))
    print(result.group(3))
    # print(result.group(4))
    re_g = re.compile('\s')
    result = re_g.split(html)
    print(result)

    re_g = re.compile('<div class="(.*?)"')
    result = re_g.match(html)
    print(result.span())
    print(html[: 22])