python正则表达式
正则表达式简介
# 正则表达式的介绍:
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配
用自己的话概括>>>:什么是正则表达式
利用一些'特殊符号'的组合去字符串中筛选出想要的数据
'所以学习正则很大程度上就是在学习一些特殊符号的使用'
# 正则表达式匹配过程:
依次拿出表达式和文本中的字符比较 如果每一个字符都能匹配 则匹配成功;
一旦有匹配不成功的字符则匹配失败 观察表达式中有量词或边界
# 使用正则表达式
'''正则表达式实现手机校验功能'''
import re
phone_number = input('please input your phone number : ').strip()
if re.match('^(13|14|15|18)[0-9]{9}$', phone_number):
print('是合法的手机号码')
else:
print('不是合法的手机号码')
"""
正则表达式是一门独立的语言 专门用来匹配、校验、筛查所需的数据
任何编程语言都可以使用 在python中如果想用就必须借助于内置模块re
"""
#在线测试网址:
http://tool.chinaz.com/regex/
正则表达式之字符组
# 特殊符号默认也是一次匹配一个字符
. 匹配除换行符以外的任意字符
\w 匹配数字、字母、下划线(后续筛选变量名可能用到)
\d 匹配任意的数字
\t 匹配一个制表符(tab键)
^ 匹配字符串的开始
eg:^9 找9并且这个9必须在开头
$ 匹配字符串的结尾
eg:9$ 找9并且这个9必须在末尾
\W 匹配非字母或数字或下划线
\D 匹配非数字
a|b 匹配a或者b 管道符就是or(或)的意思
() 给正则表达式分组 不影响正则匹配(后续再讲)
[] 字符组的概念(里面所有的数据都是或的关系)
[^] 上箭号出现在了中括号的里面意思是取反操作
正则表达式之量词
"""量词必须跟在表达式的后面 不能单独使用 目的是增加匹配的字符数"""
# 注意量词默认都是贪婪匹配(尽可能多的匹配):
* 重复零次或者多次(默认就是多次:越多越好)
+ 重复一次或者多次(默认就是多次:越多越好)
? 重复零次或者一次(默认就是一次:越多越好)
{n} 重复n次
{n,} 重复最少n次最多多次(越多越好)
{n,m} 重复n到m次(越多越好)
复杂正则的编写
# 校验用户身份证号码
身份证号码是一个长度为15或18个字符的字符串,如果是15位则全部由数字组成,首位不能为0;如果是18位,则前17位全部是数字,末位可能是数字或x
^[1-9][0-9]{14}
^[1-9][0-9]{16}[0-9x]
# 校验邮箱、快递单号、座机号...
"""很多常见的正则校验符号 不需要我们编写 直接百度查找即可"""
0?(13|14|15|17|18|19)[0-9]{9} #手机号
\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14} # 邮箱
取消转义
\n \n False
\\n \n True
\\\\n \\n True
在python中还可以在字符串的前面加r取消转义 更加方便
贪婪匹配与非贪婪匹配
#什么是贪婪匹配:
贪婪匹配在匹配字符串时总是尝试匹配尽可能多的字符
#什么是非贪婪匹配:
非贪婪匹配在匹配字符串时总是尝试匹配尽可能少的字符
'Python里数量词默认是贪婪模式的,在"*","?","+","{m,n}"后面加上?,可使贪婪模式变成非贪婪模式。'
量词默认都是贪婪匹配
贪婪非贪婪通常都是利用左右两边的条件作为筛选依据
#代码示例:
<.*> <script>alert(123)<script>
# '<script>alert(123)<script>'
贪婪匹配以最后一个大括号的出现作为结束标志
<.*?> <script>alert(123)<script> #<script> <script>
非贪婪匹配以第一个大括号的出现作为结束标志
re模块
# 什么是re模块
re模块是python独有的
正则表达式所有编程语言都可以使用
re模块、正则表达式是对字符串进行操作
# 在python中无法直接使用正则 需要借助于模块
1.内置的re模块
2.第三方的其他模块
match()方法:
# match()方法
re.match()仅在字符串的开头匹配
# 代码示例:
import re
res =re.match('a','jason kevin atony kaan')
res1 =re.match('a','ajason kevin atony kaan')
print(res) # None
print(res1) # <_sre.SRE_Match object; span=(0, 1), match='a'>
print(res1.group()) # a
search()方法:
#search()方法
检查匹配项,在字符串中的任何位置检查匹配项(这是Perl的默认设置)
# 代码示例:
res1 = re.search('a', 'jason oscar aaa') # search(正则表达式,待匹配的文本)
print(res1) # 查找到一个符合条件的数据就结束 没有则返回None
print(res1.group()) # a 没有则无法调用group() 直接报错
findall()方法:
#定义:
以string列表形式返回string中pattern的所有非重叠匹配项
从左到右扫描该字符串 并以找到的顺序返回匹配项
如果该模式中存在一个或多个组,则返回一个组列表;
否则 返回一个列表
如果模式包含多个组,则这将是一个元组列表
空匹配项包含在结果中
#代码示例:
import re
res = re.findall('a', 'jason oscar aaa') # findall(正则表达式,待匹配的文本)
print(res) # ['a', 'a', 'a', 'a', 'a'] # 结果是所有符合条件的数据 并且组织成了列表
finditer()方法:
#定义:
返回一个迭代器 该迭代器在string类型的RE 模式的所有非重叠匹配中产生匹配对象
从左到右扫描该字符串 并以找到的顺序返回匹配项
空匹配项包含在结果中
#代码示例:
re.finditer('[ab]', 'This is a beautiful place!')
<callable_iterator object at 0x0000000000DCDA90> #迭代器对象
ret=re.finditer('[ab]', 'This is a beautiful place!')
next(ret).group() #查看下一个匹配值
'a'
[i.group() for i in ret] #查看剩下所有匹配的值
['b', 'a', 'a']
compile()方法:
#定义:
将正则表达式模式编译为正则表达式对象
可使用match(),search()以及下面所述的其他方法将其用于匹配
#代码示例:
obj = re.compile('\d+') # 提前写好后续需要经常使用的正则
print(re.findall(obj,'asjd21hj13123j')) # 写一遍之后 直接反复调用即可
print(re.findall(obj,'234328748hgjghj')) # 写一遍之后 直接反复调用即可
print(re.findall(obj,'jhjhjh423432423')) # 写一遍之后 直接反复调用即可
