正则表达式前戏
正则表达式是用来匹配与查找字符串的,从网上爬取数据自然或多或少会用到正则表达式,python的正则表达式要先引入re模块,正则表达式以r引导
案例:手机号校验
基本要求:手机号必须是11位、手机号必须是 13 15 17 18 19开头、必须是纯数字
'''纯python代码实现'''
while True:
# 获取用户输入手机号
phone_num = input('请输入您的手机号>>>:').strip()
# 判断是否是11位
if len(phone_num) == 11:
# 判断是否是纯数字
if phone_num.isdigit():
# 判断手机号的开头
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('请输入您手机号')
if re.match('^(13|14|15|18|19)[0-9]{9}$', phone_number):
print('手机号正确')
else:
print('输入错误')
正则表达式是一门独立的技术 所有编程语言都可以使用
它的作用可以简单的概括为:利用一些特殊符号(也可以直接写想要查找的具体字符)的组合产生一些特殊的含义然后去字符中筛选出符合条件的数据
>>>:筛选数据(匹配数据)
字符组
'''字符组默认匹配方式是挨个挨个匹配'''
[0123456789] 匹配0到9意义一个数(全写)
[0-9] 匹配0到9任意一个数(缩写)
[a-z] 匹配26个小写英文字母
[A-Z] 匹配26个大写英文字母
[0-9a-zA-Z] 匹配数字或者小写字母或者大写字母
ps:字符组内所有的数据默认都是或的关系
特殊符号
'''特殊符号默认匹配方式是挨个挨个匹配'''
. 匹配除换行符以外的任意字符
\w 匹配数字、字母、下划线
\W 匹配非数字、非字母、非下划线
\d 匹配数字
^ 匹配字符串的开头
$ 匹配字符串的结尾
两者组合使用可以非常精确的限制匹配的内容
a|b 匹配a或者b(管道符的意思是或)
() 给正则表达式分组 不影响表达式的匹配功能
[] 字符组 内部填写的内容默认都是或的关系
[^] 取反操作 匹配除了字符组里面的其他所有字符
注意上尖号在中括号内和中括号意思完全不同
量词
'''正则表达式默认情况下都是贪婪匹配>>>:尽可能多的匹'''
* 匹配零次或多次 默认是多次(无穷次)
+ 匹配一次或多次 默认是多次(无穷次)
? 匹配零次或一次 作为量词意义不大主要用于非贪婪匹配
{n} 重复n次
{n,} 重复n次或更多次 默认是多次(无穷次)
{n,m} 重复n到m次 默认是m次
ps:量词必须结合表达式一起使用 不能单独出现 并且只影响左边第一个表达式
jason\d{3} 只影响\d
贪婪匹配与非贪婪匹配
'''所有的量词都是贪婪匹配如果想要变为非贪婪匹配只需要在量词后面加问号'''
待匹配的文本
<script>alert(123)</script>
带使用的正则(贪婪匹配)
<.*>
请问匹配的内容
<script>alert(123)</script>一条
# .*属于典型的贪婪匹配 使用它 结束条件一般在左右明确指定
待使用的正则(非贪婪匹配)
<.*?>
转义符
'''斜杠与字母的组合有时候有特殊含义'''
\n 匹配的是换行符
\\n 匹配的是文本\n
\\\\n 匹配的是文本\\n
ps:如果是在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.编写校验邮箱的正则
/^[a-zA-Z0-9_.-]+@[a-zA-Z0- 9-]+(\\.[a-zA-Z0-9-]+)*\.[a- zA-Z0-9]{2,6}$/
3.编写校验用户手机号的正则(座机、移动)
^1[3|4|5|7|8][0-9]{9}$
4.编写校验用户qq号的正则
[1-9]([0-9]{5,11})
re模块
在python中如果想要使用正则 可以考虑re模块
findall方法
# findall方法,该方法在字符串中查找模式匹配,将所有的匹配字符串以列表的形式返回,如果文本中没有任何字符串匹配模式,则返回一个空的列表,
# 如果有一个子字符串匹配模式,则返回包含一个元素的列表,所以,无论怎么匹配,我们都可以直接遍历findall返回的结果而不会出错,这对工程师
# 编写程序来说,减少了异常情况的处理,代码逻辑更加简洁
finditer方法
# finditer返回一个迭代器,遍历迭代器可以得到一个SRE_Match对象
search方法
# search方法,模式匹配成功后,也会返回一个SRE_Match对象,search方法和match的方法区别在于match只能从头开始匹配,而search可以从
# 字符串的任意位置开始匹配,他们的共同点是,如果匹配成功,返回一个SRE_Match对象,如果匹配失败,返回一个None,这里还要注意,
# search仅仅查找第一次匹配,也就是说一个字符串中包含多个模式的匹配,也只会返回第一个匹配的结果,如果要返回所有的结果,最简单
# 的方法就是findall方法,也可以使用finditer方法
group方法
# 匹配到一个符合的数据就立刻结束
match方法
#匹配字符串的开头 如果不符合后面不用看了
compile方法
#将指定的正则表达式模式编译为正则表达式对象,可用于匹配和搜索
split方法
# 按照能够匹配的子串讲字符串分割后返回列表
sub方法
#re.sub(pattern, repl, string, count=0, flags=0)
# 参数:
# pattern : 正则中的模式字符串。
# repl : 替换的字符串,也可为一个函数。
# string : 要被查找替换的原始字符串。
# count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
re模块补充说明
1.分组优先
# 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
2.分组别名
2.分组别名
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
标签:oldboy,www,匹配,python,res,re,正则,print,com
From: https://www.cnblogs.com/oiqwyig/p/16826578.html