单字符匹配
学习正则表达式一定要从简单语法到复杂语法,逐渐过渡。
"""
正则表达式
"""
import re
'''
1、匹配某个字符串:
match()----只能匹配某一个字符串
'''
text0 = 'python'
#即使匹配错误也不报错,返回none【必须从开头开始匹配,开头错误就直接none,例如text = 'cpython'】
result0 = re.match('py',text0)
print(result0)#只返回一个对象。
#group()方法:输出匹配结果,匹配错误会报错
print(result0.group())#py
'''
2、点(.):匹配某个任意字符【不能匹配换行符】【必须从开头开始匹配】
'''
text1 = 'python'
result1 = re.match('.',text1)
print(result1.group())#p
text2 = '\npython'
result2 = re.match('.',text2)
print(result2.group())#会报错
'''
3、 \d
匹配任意的某个数字【除数字外均无法匹配】
'''
text2 = '1python'
result3 = re.match('\d', text2)
print(result3.group())#1
'''
4、 \D
一个字符除数字外均可匹配【数字无法匹配】
'''
text3 = '_python'
result3 = re.match('\D', text3)
print(result3.group())#_
'''
5、 \s
匹配一个空白字符:如\n,\t,\r,空格,其他都会报错
'''
text4 = '\npython'
result4 = re.match('\s', text4)
print(result4.group())#
'''
6、 \w【小写】
匹配小写字母a-z,大写字母A-Z,数字和下划线
'''
text5 = 'python'
result5 = re.match('\w', text5)
print(result5.group())#p
'''
7、\W【大写】
大写的\W只能匹配除小写的\w以外的某个字符
'''
text6 = '\python'
result6 = re.match('\W', text6)
print(result6.group())#\
'''
8、[ ]
组合方式进行匹配,满足[ ]内的均可匹配,相当于或
'''
text7= '-python'
result7 = re.match('[\W\w]', text7)
print(result7.group())#-
多字符匹配
"""
匹配多字符
"""
import re
'''
1、星号(*) 匹配0个或任意多个字符
'''
text1 = '139-123-456-78'
result1 = re.match('[\d-]*', text1)
print(result1.group())#139-123-456-78
'''
2、加号(+) 匹配1个或任意多个字符
'''
text2 = 'a139-123-456-78'
result2 = re.match('[\d-]+', text2)
print(result2.group())#会报错
text2 = 'a139-123-456-78'
result2 = re.match('[\w-]+', text2)#'[a\d]+'
print(result2.group())#a139-123-456-78
'''
3、问号(?) 要么匹配0个,要么匹配1个
'''
text3 = '-a139-123-456-78'
result3 = re.match('[a\d]?', text3)
print(result3.group())#不会报错,输出空
'''
4、{m} 匹配指定的m个字符
'''
text4 = '139-123-456-78'
result4 = re.match('.{5}',text4)
print(result4.group())#139-
'''
5、{m,n} 匹配m到n个字符,取最多
'''
text5 = '139-123-456-78'
result5 = re.match('[-\d]{2,6}',text5)
print(result5.group())#139-12
text5 = '139-1|23-456-78'
result5 = re.match('[-\d]{2,6}',text5)
print(result5.group())#139-1,会尽可能多的匹配字符,到不能识别为止
匹配规则的替代方案
import re
"""
1.匹配所有的数字
\d ->>[0-9]
"""
#text = '139-1234-5678'
#result = re.match('[-0-9]*', text)
#print(result.group())
"""
2.匹配所有的非数字
\D ->> [^0-9]
"""
#text = '139-1234-5678'
#result = re.match('[^0-9]+', text)
#print(result.group())
"""
3.匹配所有的数字、字母和下划线
\w ->> [0-9a-zA-Z_]
"""
#text = '139_1234_5678'
#result = re.match('[0-9a-zA-Z_]+', text)
#print(result.group())
"""
4.匹配所有的非数字、字母和下划线
\W ->> [^0-9a-zA-Z_]
"""
#text = '-----139_1234_5678'
#result = re.match('[^0-9a-zA-Z_]+', text)
#print(result.group())
"""
5.匹配所有的字符
[\d\D]
[\w\W]
"""
text = '-----139_123\n4_ 5 \t678'
result = re.match('[\d\D]+', text)
print(result.group())
正则表达式的特殊匹配
import re
"""
点(.) ->>在中括号内仅表示匹配点(.)
* ->匹配零个或者多个字符
+ ->匹配一个或者多个字符
? ->要么零个要么一个
^ ->取反
【$ |】
"""
text = '...........python12--//'
result = re.match('[.]+', text)
print(result.group())
正则表达式匹配手机号、身份证号、邮箱
import re
"""
1.验证手机号
[11位 数字]
13012345678
1: ->>1
2: ->>[3456789]
3-11 ->>[0-9]
"""
#text = '15012345678'
#result = re.match('1[3456789][0-9]{9}', text)
#print(result.group())
"""
2.验证邮箱
...@xxx.com
python123@163.com
... ->英文字母、数字、下划线
xxx ->数字、字母【大写不存在】
"""
#text = 'P_ython123@QQ.com'
#result = re.match('\w+@[0-9a-z]+[.]com', text)
#print(result.group())
"""
3.验证身份证号
[18位]
前17位 : [0-9]
18位:[0-9xX]
"""
text = '11010119900307781X'
result = re.match('[0-9]{17}[0-9xX]', text)
print(result.group())
search()、$、|
"""
re.match():【必须】从字符串开头进行匹配,开头没有就停止
re.search():从左到右进行字符串的遍历,找到就返回并停止
"""
"""
1.脱字号(^)
(1)在中括号内表示取反
(2)在中括号外表示以指定的字符开始
"""
import re
text = 'aapython'
result = re.search('py' ,text)
print(result.group())#py
#text = 'aapythopyn'
#result = re.search('^a[a-z]+' ,text)
#print(result.group())
"""
2.$
以...为结尾
"""
#text = 'python123@163.com'
#result = re.search('[\w]+@[a-z0-9]+[.]com$' ,text)
#print(result.group())
"""
3.|
匹配多个表达式或者字符串
(1)中括号认为里面的都是单个字符
(2)小括号认为是不同的字符串
"""
text = 'https://www.baidu.com/'
result = re.search('(https|http|ftp|file)://www' ,text)#匹配url的时候这样写
print(result.group())
贪婪模式和非贪婪模式**********(重要)
"""
1.贪婪模式:正则表达式会尽可能多地匹配字符【默认就是贪婪模式】
2.非贪婪模式:正则表达式会尽可能少地匹配字符【?】
"""
import re
text = 'python'
result = re.match('[a-z]+?', text)
print(result.group())
#三引号后有换行,需要加\s
text = \
"""
<tr class="hots">
<td class="1">hot1</td>
<td class="2">hot2</td>
<td class="3">hot3</td>
<td class="4">hot4</td>
<td class="5">hot5</td>
<td class="6">爬虫</td>
</tr>
"""
result = re.match('\s<tr[\d\D]+?>', text)
print(result.group())
#贪婪模式会尽可能多地匹配,因此会忽略掉中间的>,直接到最后一个>,输出全部
#加了?是非贪婪模式,尽可能少地匹配字符,在第一个>处停止。
转义符
import re
"""
转义字(把字符转换为原有含义):\
盘点特殊字符:
点(.) ->匹配任意字符
星(*) ->匹配0个或者多个字符
加号(+) ->匹配1个或者多个字符
问号(?) ->要么0个要么1个【非贪婪模式】
$ ->以。。。为结尾
| ->或
^ ->(1)中括号内表示取反(2)中括号外表示以。。。为开始
"""
text = '***3...1415926***'
result = re.match('\*+\d\.+\d+\*+', text)
print(result.group())
正则表达式中的group分组
'''
( )括号内的数据可以拿出来
'''
import re
text = 'my email is 2781162818@qq.com and python123@163.com'
result = re.match('[\s\w]+\s(\w+@[0-9a-z]+.com)[\s\w]+\s(\w+@[0-9a-z]+.com)', text)
result = re.search('\s(\w+@[0-9a-z]+.com)[\s\w]+\s(\w+@[0-9a-z]+.com)', text)
print(result.group())#匹配所有的内容
print(result.group(1))#匹配第一个括号
print(result.group(2))#匹配第二个括号
正则表达式中常见的函数
"""
1.re.match():从[开头]左到右进行匹配【开头不满足即失败】
2.re.search():在整个字符串中查找,返回第一个被找到的字符串【只返回第一个】
3.re.findall():在整个字符串中查找所有满足条件的字符串【返回结果为列表】
4.re.sub:替换字符串【匹配出来的字符串进行人为替换】
5.re.split():主要用来分割字符串
6.re.compile():进行编译
"""
import re
text = 'my email is 2781162818@qq.com and python123@163.com'
#result = re.sub('\s(\w+@[0-9a-z]+\.com)', 'wrong', text)
#print(result)
#text = 'my|email$is 2781162818@qq.com and python123@163.com'
#resutl = re.split('[^\w]', text)#只要不是字母数字下换线就认为是字符
#print(resutl)
#最好这样写,不然时间久了会忘记。
r = re.compile(r"""
\s #邮箱前的空格
(\w+ #邮箱的第一部分
@
[0-9a-z]+ #邮箱的第二部分
\.com)
""",
re.VERBOSE#忽略换行
)
result = re.findall(r, text)
print(result)
正则表达式的应用
import re
text = ''
'''
1、获取所有的div标签:开头是<div>,结尾是</div>
'''
result = re.findall('<div[\d\D]*</div>',text)#默认是贪婪模式,所有结果会在一起
result = re.findall('<div[\d\D]*?</div>', text)#改为非贪婪模式后,每个标签会被分别贮存到列表中
result = re.findall('<div[.]*?</div>', text,re.DOTALL)#加入参数re.DOTALL后可以让[.]表示所有,除了\n
'''
2、包含某个属性的标签
'''
result = re.findall('<div\sid.*?</div>', text, re.DOTALL)#包含id的标签
'''
3、获取所有id="even"的div标签
'''
result = re.findall('<div\sid="even".*?</div>', text, re.DOTALL)#包含id的标签
'''
4、获取某个标签的id属性的值
'''
#获取div的id属性的值
result = re.findall('<div\sid="(.*?)”.*?</div>', text, re.DOTALL)
#获取a标签,href的值
result = re.findall('<a.*?href="(.*?)".*?</a>', text, re.DOTALL)
'''
5、获取div中所有的职位信息
'''
result = re.findall('<span>(.*?)</span>', text, re.DOTALL)