正则表达式

Day21正则表达式

  1. 正则表达式能干什么?
  2. 正则表达式之字符组
  3. 正则表达式之特殊符号
  4. 正则表达式之量词及转义符
  5. 正则表达式之贪婪与非贪婪匹配
  6. 正则表达式之实战应用
  7. python正则模块之re
1.正则表达式能干什么?

​ 定义:正则表达式是对字符串操作的一种逻辑公式,正则表达式是一门独立的技术 所有编程语言都可以使用
​ 是一个强大的字符串匹配工具。

​ 作用:检索、替换那些符合某个模式(规则)的文本,可以通过一些设定的规则来匹配一些字符串

​ 应用场景:网络爬虫 各种校验的编写

​ 在线测试工具 :http://tool.chinaz.com/regex/

2.正则表达式之字符组
字符 对应解释
[0123456789] 匹配0到9任意一个数字(全写)
[0-9] 匹配0到9任意一个数字(缩写)
[a-z] 匹配26个小写英语字母
[A-Z] 匹配26个大写英语字母
[0-9a-zA-Z] 匹配数字小写字母大写字母

ps:字符组内所有的数据默认都是或的关系

3.正则表达式之特殊符号
特 殊符号 其解释
. 匹配除换行符以外的任意字符
\w 匹配数字 字母 下划线
\W 匹配非数字非字母非下划线
\d 匹配数字
^ 匹配字符串的开头第一个字符
$ 匹配字符串结尾的结尾最后一个字符
a|b 匹配a或b(管道符就是或的意思)
() 匹配给正则表达式分组
[ ] 字符组内部填写的内容默认是或的关系
4.正则表达式之量词及转义符
符号 其解释
* 匹配无穷次(有多少就匹配多少)
+ 匹配无穷次(有多少就匹配多少)
匹配无穷次(有多少就匹配多少)
匹配n次
? 匹配一次(主要用于非贪婪匹配)
\n 匹配换行符
\ \n 匹配文本 \n
\ \ \n 匹配 \ \ n

ps:斜杠与字母的组合有时候又特殊含义 因此在python中在字符串前面加字母r来取消转义

5.正则表达式之贪婪与非贪婪匹配
.*  是贪婪匹配
.*? 是非贪婪匹配
6.正则表达式之实战应用
同一个需求:手机号必须是11位、手机号必须以13 15 17 18 19开头、必须是纯数字

用python实现如下
# 1.获取用户输入的手机号
    phone_num = input('请输入您的手机号>>>:').strip()
    # 2.先判断是否是十一位
    if len(phone_num) == 11:
        # 3.再判断是否是纯数字
        if phone_num.isdigit():
            # 4.判断手机号的开头
            if phone_num.startswith('13') or phone_num.startswith('15') or phone_num.startswith(
                    '17') or phone_num.startswith('18') or phone_num.startswith('19'):
                print('手机号码输入正确')
            else:
                print('手机号开头不对')
        else:
            print('手机号必须是纯数字')
    else:
        print('手机号必须是11位')
'''python结合正则实现'''
import re

phone_number = input('please input your phone number: ')
if re.match('^(13|14|15|18)[0-9]{9}$', phone_number):
    print('是合法的手机号码')
else:
    print('不是合法的手机号码')
    
    
用正则表达式实现如下
0?(13|14|15|17|18|19)[0-9]{9}
7.python正则模块之re
import re


1.常见操作方法
# res = re.findall('a', 'jason apple eva')
# print(res)  # 查找所有符合正则表达式要求的数据 结果直接是一个列表
# res = re.finditer('a', 'jason apple eva')
# print(res)  # 查找所有符合正则表达式要求的数据 结果直接是一个迭代器对象
# res = re.search('a', 'jason apple eva')
# print(res)  # <re.Match object; span=(1, 2), match='a'>
# print(res.group())  # a  匹配到一个符合条件的数据就立刻结束
# res = re.match('a', 'jason apple eva')
# print(res)  # None  匹配字符串的开头 如果不符合后面不用看了
# print(res.group())  # 匹配开头符合条件的数据 一个就结束
# obj = re.compile('\d{3}')  # 当某一个正则表达式需要频繁使用的时候 我们可以做成模板
# res1 = obj.findall('23423422342342344')
# res2 = obj.findall('asjdkasjdk32423')
# print(res1, res2)


ret = re.split('[ab]', 'abcd')  # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
print(ret)  # ['', '', 'cd']

ret = re.sub('\d', 'H', 'eva3jason4yuan4', 1)  # 将数字替换成'H',参数1表示只替换1个
print(ret)  # evaHjason4yuan4

ret = re.subn('\d', 'H', 'eva3jason4yuan4')  # 将数字替换成'H',返回元组(替换的结果,替换了多少次)
print(ret)  # ('evaHjasonHyuanH', 3)

2.分组优先
 # res = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
    # print(res)  # ['oldboy']
    # findall分组优先展示:优先展示括号内正则表达式匹配到的内容
    # res = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
    # print(res)  # ['www.oldboy.com']

    # res = re.search('www.(baidu|oldboy).com', 'www.oldboy.com')
    # print(res.group())  # www.oldboy.com
    # res = re.match('www.(baidu|oldboy).com', 'www.oldboy.com')
    # print(res.group())  # www.oldboy.com
3.分组别名
  res = re.search('www.(?P<content>baidu|oldboy)(?P<hei>.com)', 'www.oldboy.com')
    print(res.group())  # www.oldboy.com
    print(res.group('content'))  # oldboy
    print(res.group(0))  # www.oldboy.com
    print(res.group(1))  # oldboy
    print(res.group(2))  # .com
    print(res.group('hei'))  # .com
posted @ 2022-10-25 20:46  阿丽米热  阅读(39)  评论(0编辑  收藏  举报
Title