python基础入门之正则表达式
python基础入门之正则表达式
正则表达式前戏
while True:
# 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结合正则实现'''
phone_number = input('please input your phone number: ')
if re.match('^(13|14|15|18)[0-9]{9}$', phone_number):
print('是合法的手机号码')
else:
print('不是合法的手机号码')
通过使用正则表达式,可以:
1.测试字符串内的模式。
例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。
这称为数据验证。
2.替换文本。
可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。
3.基于模式匹配从字符串中提取子字符串。
可以查找文档内或输入域内特定的文本
字符组
'''字符组默认匹配方式是挨个挨个匹配'''
[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{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-9-()()]{7,18}
手机:\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}
4.编写校验用户qq号的正则
[1-9]([0-9]{5,11})
re模块
# while 1:
# phone_num=input('请输入您的手机号>>>:').strip()
# if len(phone_num)==11:
# if not phone_num.isdigit():
# print('手机号必须是纯数字')
# 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( print('手机号开头不对'))
# print(print('手机号码输入正确'))
#
# print('手机号必须是11位')
#
import re
res=re.findall('a','jason apple eva')
print(res)#['a', 'a', 'a']# 查找所有符合正则表达式要求的数据 结果直接是一个列表
res=re.finditer('a','jason apple eva')
print(res)#<callable_iterator object at 0x000001FBF213C2E0>迭代器对象## 查找所有符合正则表达式要求的数据 结果直接是一个迭代器对象
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', 'ason apple eva')
print(res)#None 匹配字符串的开头 如果不符合后面不用看了<re.Match object; span=(0, 1), match='a'>
print(res.group())#a匹配开头符合条件的数据 一个就结束没有匹配到就会报错
obj=re.compile('\d{3}')
res=obj.findall('23423422342342344')
res2 = obj.findall('asjdkasjdk32423')
print(res,res2)
ret=re.split('[ab]','abcd')#先对a分割得到‘’和‘bcd'再对’‘和’bcd‘
print(ret)
ret=re.sub('\d','H','eva3jason4yuan4',2)#将数字替换成'H',参数2表示只替换2个
print(ret)#evaHjasonHyuan4
ret=re.subn('\d','H','eva3jason4yuan4')# 将数字替换成'H',返回元组(替换的结果,替换了多少次)
print(ret)#('evaHjasonHyuanH', 3)
re模块补充说明
1.分组优先
import re
res=re.findall('www.(baidu|oldboy).com','www.oldboy.com')
print(res)#['oldboy']
res=re.findall('www.(?:baidu|oldboy).com','www.oldboy.com')
res=res[0]
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)#<re.Match object; span=(0, 14), match='www.oldboy.com'>
print(res.group())#www.oldboy.com
2.分组别名
res = re.search('www.(?P<content>baidu|oldboy)(?P<hei>.com)', 'www.oldboy.com')
res1=re.search('www.(?P<content>baidu|oldboy)(?P<hei>.com)','www.baidu.cpm')
print(res.group())#www.oldboy.com
print(res.group('content'))#oldboy
print(res.group(0))#www.oldboy.com 0 代表全部组
print(res.group(1))#oldboy 第一组符合要求的值
print(res.group(2))#.com
print(res.group('hei'))#.com
网络爬虫简介
通过编写代码模拟浏览器发送请求获取数据并按照自己指定的要求筛选出想要的数据。