正则表达式

正则表达式

  • 正则表达式前夕

  • 正则表达式之字符组

  • 正则表达式之量词

  • 正则表达式之特殊符号

  • 正则表达式练习

  • 正则表达式贪婪匹配和非贪婪匹配

  • 正则表达式应用

  • python正则模块re

  • 正则表达式前夕

正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。

1. 例如京东的注册页面,可以检测手机号的输入是否正确,这个功能如何实现

# 这里先不使用正则去使用python代码实现
# 京东注册页面实现手机号检测

# 1. 获取用户输入
usercode = input('请输入注册手机号: ')

# 2. 分析,手机号为11位,判断位数是否相等11
if len(usercode) == 11:
    # 3. 判断用户输入的是否为纯数字
    if usercode.isdigit():
        # 4. 继续分析,手机号一般有很多开头,这里演示188开头
        if usercode.startswith('188'):
            print('验证通过')
        else:
            print('请输入正确的手机号')
    else:
        print('请输入数字')
else:
    print('请输入正确的手机号长度')
# 代码执行结果,只有188开头的手机号码才可以通过注册
请输入注册手机号: 18800000000
验证通过


# 如果使用正则这个功能如何书写
import re
user_code = input('请输入手机号: ').strip()
if re.match('^188[0-9]{8}$', user_code):
    print('合法的手机号')
else:
    print('非法手机号码')
    
# 代码运行结果
请输入手机号: 18800000000
合法的手机号

# 接下来我们来学习如何使用正则表达式

  • 正则表达式之字符组
1. 字符组内所有的数据默认都是或的关系
2. 字符组默认匹配规则是一个一个匹配

[0123456789]		匹配0到9任意一个数(全写)
[0-9]			   匹配0到9任意一个数(缩写)
[a-z]		      匹配26个小写英文字母
[A-Z]			   匹配26个大写英文字母
[0-9a-zA-Z]			匹配数字或者小写字母或者大写字母
  • 正则表达式常用特殊符号

    特殊符号默认匹配方式是挨个匹配

正则符号 解释
. 匹配除换行符以外的任意字符
\w 匹配数字,字母,下划线
\W 匹配非数字,非字母,非下划线
^ 匹配字符串的开头
$ 匹配字符串的结尾
| 或的意思,类似于or,比如a|b,匹配a或者b
() 给正则表达式分组,不影响表达式的匹配功能
[] 字符组内部填写的内容默认都是或的关系
[^] 取反操作 匹配除了字符组里面的其他所有字符
  • 量词
  1. 正则表达式默认情况下都是贪婪匹配

    量词必须结合表达式一起使用,不能单独出现,并且只影响左边第一个表达式

    例如: Wesley\d{3} 只影响\d

正则符号 解释
* 匹配0次或者无穷次
+ 匹配一次或者无穷次
重复n次
重复n次或更多次
重复n到m次,默认m次
  • 贪婪匹配

所有的量词都是贪婪匹配,如果想更改为非贪婪匹配,只需要再量词后面加问号即可

1. 待匹配文本
<script>wesley(123)</script>
待使用的正则(贪婪匹配)
<.*>
匹配的内容为<script>wesley(123)</script> 一条数据
待使用的正则
<.*?>
匹配内容为 <script> </script> 2条内容
这里加了问号就相当于每一次匹配的结束条件为>
  • 转义符
1. 在计算机中反斜杠组合的字母部分有特殊含义需要使用转义符转义
\n  # \n代表换行符,若需要匹配则需要再次使用反斜杠转义
对\n进行转义\\n

2. 在python中可以取消转义的字符还有r,也是可以转义的

  • 关于正则表达式使用建议
1.编写校验用户身份证号的正则
	 ^[1-9]\d{13,16}[0-9x]$
    ^[1-9]\d{14}(\d{2}[0-9x])?$
    ^([1-9]\d{16}[0-9x]|[1-9]\d{14})$
2.编写校验邮箱的正则
3.编写校验用户手机号的正则(座机、移动)
4.编写校验用户qq号的正则

"""
相对一复杂度一般,且常用的正则表达式,建议pytho开发者们,面对百度编程
"""
  • re模块
  1. 如果在python中使用正则表达式,可以使用re模块
# 模块使用演示
# re模块的使用
import re
res = re.findall('a', 'java append as')
print(res)
# 结果,直接返回匹配到的实际,以列表的形式
['a', 'a', 'a', 'a']

res = re.finditer('a', 'java append as')
print(res)
# 结果,直接返回的是一个迭代器对象
<callable_iterator object at 0x104694910>

res = re.search('a', 'java append as')
print(res)
# 结果
<re.Match object; span=(1, 2), match='a'>
# 可以使用group查看
print(res.group())
# 结果 a  group 匹配到一个就立刻结束


res = re.match('a', 'java append as')
print(res)
# match会匹配开头,若没有直接返回None


ojb = re.compile('\d{3}')
# 当某个正则经常使用时可以封装成模版
res1 = ojb.findall('123123u02913701294')
res2 = ojb.findall('j31l2k3jl12jl3k12jlk3j1l2j312312')
print(res1, res2)
# 结果
['123', '123', '029', '137', '012'] ['312', '312']

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

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

res = re.subn('\d', 'H', 'eva3jason4yuan5')
# 将数字替换成H,返回元组(替换的结果,替换了多少次)
print(res)  # ('evaHjasonHyuanH', 3)
  • re模块补充说明
1. 分组优先
res = re.findall('www.(baidu|google).com') , www.baidu.com
print(res) # ['baidu']
# findall分组优先展示:优先展示括号内正则表达式匹配的内容
# 可以使用?:的方式取消这种优先展示
res = re.findall('www.(?:baidu|google).com', 'www.baidu.com')
print(res)  # ['www.baidu.com']

2. res = re.search('www.(baidu|google).com', 'www.baidu.com')
print(res.group()) # www.baidu.com

3. res = re.match('www.(baidu|google).com', 'www.baidu.com')
print(res.group()) # www.baidu.com
  • 分组别名
1. 可以通过分组和分组名还有索引来取值
res = re.search('www.(?P<content>baidu|google)(?P<hei>.com)', 'www.baidu.com')
print(res.group())  # www.baidu.com
print(res.group('content')) # baidu
print(res.group(0)) # www.oldboy.com
print(res.group(1)) # .com
print(res.group(hei)) # .com

posted @ 2025-03-13 11:47  樵夫-  阅读(17)  评论(0)    收藏  举报