首页 > 其他分享 >正则表达式

正则表达式

时间:2022-10-25 19:11:22浏览次数:49  
标签:www 匹配 正则表达式 re taobao print com

内容概要

  • 购物车程序设计
  • 正则表达式
  • 字符组
  • 量词
  • 贪婪匹配与非贪婪匹配
  • 转义符
  • 正则表达式实战
  • re模块
  • 简易爬虫题目

购物车程序设计

1.项目框架搭建
空函数
功能字典
循环匹配功能执行
2.项目注册功能
获取用户输入用户名密码,并二次校验密码
用户数据注册保存db目录中
	获取执行文件所在目录路径
    自动拼接存储用户数据db目录路径(如不存在,则自动创建)
拼接用户文件的绝对路径
	判断绝对路径是否存在
    如果存在表示用户已注册
 如果不在则使用json模块序列化 存写数据进入 json文件内部
3.用户登录功能
获取用户输入用户名和密码
拼接用户文件路径,并判断用户名是否在用户文件路径中
如果存在则读取该文件中数据信息,并对密码进行比对
成功则登录,并保存用户状态修改用户状态字典
失败则返回
4.装饰器
装饰需要登录操作的功能,通过用户字典是否有值
如果需要登录则使用语法糖
5.项目购物车功能
获取商品信息并枚举循环打印
获取用户输入商品编号及商品数量
考虑到要写入json文件中,应该创建临时购物车先存放用户挑选产品
最后一次性写入json文件当中
临时购物车中添加键值对
如果用户json文件购物车里面已经存在商品,就不能用临时购物车替换
所以如果商品存在就修改它现有数量
如果不存在就添加进去
退出购物车程序之前需要一次性修改当前登录用户购物车数据
6.购物车结算功能
读取用户数据
循环遍历购物车商品数据
判断是否超出余额
如果没有超出 则完成扣款 清空购物车并保存

正则表达式

1.正则表达式
正则表达式是一门独立的技术,所有编程语言都可以使用正则表达式
它主要的作用是:
 #  利用一些特符号(也可以直接写需要查找的具体字符)的组合产生一些特殊的含义然后去字符串中去筛选出符合条件的数据
    '''筛选数据---匹配数据'''

    
https://tool.chinaz.com/regex  # 在线测试正则网址

字符组

# 字符组
字符组默认匹配方式为一个一个比对(匹配)
[0123456789] 	# 匹配0——9的任意一个数字
[0-9] 		    # 匹配0——9的任意一个数字 (缩写)
[a-z]			# 匹配小写字母a-z的任意一个字母(缩写)
[A-Z] 			# 匹配大写字母A-Z的任意一个字母 (缩写)
[0-9a-zA-]       # 匹配数据或者小写字母或者大写字母
'''我们可以通过上述信息可以看出在字符组中[]里面的数据都是或的意思'''

特殊符号

'''特殊符号默认匹配方式是一个一个比对(匹配)'''
.			# 匹配除换行符以外的任意字符
\w   		 #匹配数字、字母、下划线的字符
\W(大写)      # 匹配除数字、字母、下划线的任意字符
\d			# 匹配 数字
^  			# 匹配字符串开头
$  			# 匹配字符串结尾
 
a|b  		# 表示匹配a或b     |是或的意思
()			# 表示一个组,并不影响匹配功能
[]   		# 字符组 内部填写内容默认都是或的关系
[^]			# 表示除了^开头之外的其他所有字符

量词

# 量词
*		# 匹配0次或者多次 默认是无穷次
+ 		# 匹配一次或多次  默认是无穷次
? 		# 匹配0次或一次	作为量词来说意义不大,主要用于非贪婪匹配
{n}  	# 重复n次
{n,}  	# 重复n 或更多次		默认是多次{无穷次}
{n,m}    #重复 n,m次       默认是m次 

'''正则表达式默认情况下都是贪婪匹配--尽可能多的去匹配'''
	量词必须结合表达式一起使用,不能单独出现,并且只影响左手边第一个表达式

贪婪匹配与非贪婪匹配

# 贪婪匹配:
所有量词都是贪婪匹配,如果想要变为非贪婪匹配,我们只需要在量词后面加上问号
待匹配的文本
<strip>larb(123)</script>
我们使用正则表达式来匹配内容
<.*>
# 我们会得到 <strip>larb(123)</script> 这一条匹配结果
因为.* 就是贪婪匹配,除换行符之外的所有数据都可以被匹配
<>  前后的精准匹配由于与文本中的首尾都一样,所以在贪婪匹配下会看量词左右的匹配条件
# 我们在使用.* 贪婪匹配的时候,结束条件一般在左右明确指定
非贪婪匹配
<.*?>
由于在量词后面加了问号,则不属于贪婪匹配
此时就会根据左右两边的精准匹配条件进行匹配
得到<strip>  </script> 这两个个结果

转义符

'''斜杠与字母的组合有时候含有特殊含义'''
\n    		# 匹配的是换行符
\\n          # 匹配的是文本\n
如果我们需要匹配文本\\n
则:
\\\\n  需要这样写
如果我们在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.校验邮箱的正则
\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}
3.校验用户手机号的正则(座机、移动)
0?(13|14|15|17|18|19)[0-9]{9}  # 手机
[0-9-()()]{7,18}  # 座机
4.校验用户qq号的正则
[1-9]([0-9]{5,11})
5.格式日期
\d{4}(\-|\/|.)\d{1,2}\1\d{1,2}    # 2019-10-24
6.校验ip地址正则
(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)

image-20221025160727741

re模块

在python中我们想使用正则表达式
那么我们需要导入re模块
import re

findall() / finditer()

findall()  此方法里面需要填写两个参数,一个是正则表达式,一个是待匹配的数据
# 它会返回正则表达式匹配成功后的成果(列表形式)
finditer() 
# 它跟findall 方法一样,但是返回的结果是一个迭代器对象,这个方法更节省内存

search/match

search()  # 匹配到一个符合条件的数据就立刻结束
res1 = re.search('a','cacasdasdaweqweqa')
print(res1)  # 得到的是一个 <re.Match object; span=(1, 2), match='a'>  对象
# 我们需要通过  print(res1.group()) 方法 就可以获得匹配到的值
print(res1.group())  


match()
res2 = re.match('a','acasdasdaweqweqa')
print(res1)  # 判断开头是否为 正则表达式匹配的内容,如果不是返回None 如果是 返回<re.Match object; span=(1, 2), match='a'> 
print(res1.group()) # 我们需要通过  print(res2.group()) 方法 就可以获得匹配到的值 a

compile

compile()
obj = re.compile('\d{2}')  # 当某一个正则表达式需要频繁使用的时候 我们可以做成模板
res1 = obj.findall('234679879078042344')
res2 = obj.findall('a12341243jdk32423')
print(res1, res2)

split/sub/subn

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)

re模块补充说明:

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

    # res = re.search('www.(baidu|taobao).com', 'www.taobao.com')
    # print(res.group())  # www.taobao.com
    # res = re.match('www.(baidu|taobao).com', 'www.taobao.com')
    # print(res.group())  # www.taobao.com
    
2.分组别名
    res = re.search('www.(?P<content>baidu|taobao)(?P<hei>.com)', 'www.taobao.com')
    print(res.group())  # www.taobao.com
    print(res.group('content'))  # taobao
    print(res.group(0))  # www.taobao.com
    print(res.group(1))  # taobao
    print(res.group(2))  # .com
    print(res.group('hei'))  # .com

练习题及答案

爬网站数据并格式化输出

标签:www,匹配,正则表达式,re,taobao,print,com
From: https://www.cnblogs.com/ddsuifeng/p/16825970.html

相关文章

  • 正则表达式
    概念正则表达式可以用来匹配字符串,可以实现字符串的截取或者按规则替换和验证字符串的内容在js中创建正则表达式对象varreg=newRegExp("123");varreg=/123/;//......
  • 牛客BM76(正则表达式匹配)
    BM76正则表达式匹配具体实现:1.确定dp数组以及下标的含义dp[i][j]代表s中以i结尾的子串和p中j为结尾的子串是否匹配2.状态转移(1)p[j]为普通字符:匹配的条件是前面的字符......
  • 正则表达式
    一、正则表达式    是用来描述字符串内容格式,使用它通常用于匹配一个字符串的内容是否符合格式要求。1.[]:表示一个字符,该字符可以是[]中指定的内容例如:[a......
  • JavaScript学习--正则表达式
       /[^0-9]/g表示除了0-9其他所有的更多在https://www.runoob.com/regexp/regexp-tutorial.html ......
  • 正则表达式
    正则表达式(regularexpression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。构......
  • Python正则表达式(Python RegEx)
    Python正则表达式目录Python正则表达式快速参考函数详解match()search()捕获和分组Match对象sub()compile()findall()finditer()split()参考博客与示例代码快速参考常用......
  • 【正则】578- 1小时真正掌握正则表达式
    1.基本匹配正则表达式其实就是在执行搜索时的格式,它由一些字母和数字组合而成.例如:一个正则表达式 ​​the​​​,它表示一个规则:由字母​​t​​​开始,接着是​......
  • day16 正则表达式 & 反射 & Java内存模型(JMM)
    day16class1)获取一个类的所有信息(变量、方法、构造方法)2)创建类对象newInstance()Field1)访问变量或给变量赋值Method1)执行具体类对象的指定方法3.Method(获取方法对......
  • day51-正则表达式02
    正则表达式025.4正则表达式语法025.4.6捕获分组详见5.3.3例子packageli.regexp;importjava.util.regex.Matcher;importjava.util.regex.Pattern;//演示分......
  • jsp页面中的正则表达式--主要用于js判断文本格式
    一、方括号[]举例:二、^三、元字符举例的话,就可以这么说,要实现要表示整数的话:[]就表示输入的文本框里面的数字的第一位,可以这么写--->[1-9]然后已知\d表示的与[0-9......