正则表达式
\D 匹配任意非数字
P{2,5} 表示匹配P 2-5次,PP PPP PPPP PPPP都可以
^Dear.
表示匹配的字符必须以Dear开头
.com$
表示匹配的字符必须以com结尾。
[abc]{2}
表示[]
中任意出现2个字符均可以,aa ab ac bc bb cc ba ca 都可以。
(abc){3}
表示匹配字符串abc
连续3次
(\d{1,3\.}{3}(\d{1,3})
表示匹配1-3位数字+点 3次,然后后面再匹配一个1-3位的数字一次
正则表达式分组
He love her lover
He like her liker
为了匹配上面的,可采用正则表达式:He (?P<name>l..e) her \k<name>r.
其中(?P<name>l..e)
是匹配的l..e
,中间两个..
表示任意两个字符,必须匹配形如l..e
的字符
?<name>
表示给该组取一个名字叫做name
,后面引用该组时,用\k<name>
。
非贪婪模式
在要匹配的后面加上?即表示非贪婪
abacthjtfohjfohfohcf
对于贪婪模式,即ab.+c
,
对于非贪婪模式,即ab.+?c
只找到abac
正则进阶
#普通re
import re
#将正则表达式编译
pattern = re.compile(r'hello') #写正则表达式前加 r
#通过match进行匹配,如果匹配成功返回匹配对象,不成功返回None
s = 'hello world'
test = pattern.match(s)
print(test)
#忽略大小写的正则表达式匹配
import re
#将正则表达式编译
pattern = re.compile(r'hello',re.I) #写正则表达式前加 r re.I表示忽略大小写进行匹配
#通过match进行匹配,如果匹配成功返回匹配对象,不成功返回None
s = 'Hello world'
test = pattern.match(s)
print(test)
findall
得到的是匹配的列表
import re
content = 'One1Two22tHree333foUr4444fIVe5555siX66666sEVen777777'
#使用编译
pattern = re.compile(r'[a-z]+',re.I) #使用正则表达式,找出所有的字母,不区分大小写
result = pattern.findall(content)
print(result)
#不使用编译
result = re.findall(r'[a-z]+',content,re.I)
print(result)
search
search和match有一样的作用,都可以从全局字符串中寻找。
search匹配的是匹配的对象
import re
content = 'hello woRld!!!!'
pattern = re.compile(r'world',re.I)
#使用search
result_search = pattern.search(content)
print(result_search)
#使用match
result_match = pattern.match(content)
print(result_search)
group:返回该对象对应的原内容
子组就是正则表达式中的 ()
import re
content = 'hello world'
#先编译正则表达式的匹配模式
pattern = re.compile(r'worLd')
#使用search得到匹配对象
result_search = pattern.search(content)
if result_search: #如果找到了,匹配到了对象 如果找不到则不显示防止报错
print(result_search.group()) #在打印自身,即得到匹配对象的内容
def test_id_card(): #小心这里是test_开头,python会默认为进入测试模式!
p = re.compile(r'(\d{6})(?P<year>\d{4})(?P<month>\d{2})(?P<day>\d{2})(\d{2})(\d{1})([0-9]|X)')
#上面的正则表达式共分了7个子元组。group(i)为第i个子元组。groups为所有元组
id1 = '37078118540503888X'
result_search = p.search(id1)
print(result_search.group(3))
print(result_search.groups())
print(result_search.groupdict()) #groupdict表示元组名和元组之间的映射。
if __name__ == '__main__':
test_id_card()
测试结果;
('370781', '1854', '05', '03', '88', '8', 'X')
{'year': '1854', 'month': '05', 'day': '03'}
name==main的用法:
if __name__ == '__main__':
test_id_card()
在py文件中,如果有该行,则自己直接运行时,if __name__ == '__main__':
下面的所有行会被运行。
如果是引用该py文件,则if __name__ == '__main__':
下面的所有行都不会被运行。
import re
#使用split将字符串按数字分隔开
pattern = re.compile(r'\s+')
s = '123 456 798 654 321 159 876'
my_list = pattern.split(s)
print(my_list)
>>>>['123', '456', '798', '654', '321', '159', '876']
import re
#使用split将字符串按数字分隔开
#构建正则表达式对象
pattern = re.compile(r'\d+')
content = 'one122two244three35359four698five5667'
#使用split
result_split = re.split(pattern,content)
#等价于
result_split = pattern.split(content)
print(result_split)
>>>>['one', 'two', 'three', 'four', 'five', '']
#使用sub来替换之前的内容
pattern = re.compile(r'\d+')
content = 'one122two244three35359four698five5667'
result = pattern.sub('@',content)
print(result)
>>>>one@two@three@four@five@
#也可以使用字符串的replace来替换,但是比较麻烦
result2 = content.replace('122','@').replace('244','@')
print(result2)
#使用正则表达式交换位置
s = 'hello world!'
pattern = re.compile(r'(?P<first>\w+) (?P<second>\w+)') #实现以空格为区分
result = pattern.sub(r'\2 \1',s) #\2 \1实现两个单词的位置互换
print(result)
#在原有基础上,替换并改变内容
def f(m):
'''使用函数进行替换并改变'''
return m.group(2).upper() + ' ' + m.group(1)
result = pattern.sub(f,s)
print(result)
#使用匿名函数替换 lambda表达式
result_lambda = pattern.sub(lambda m:m.group(2).upper() + ' ' + m.group(1),s)
print(result_lambda)
正则表达式中使用元组提取特定内容
import re
s = '我是刘广琦'
pattern = re.compile(r'我是(.+)')
result = pattern.findall(s)
print(result)
输出结果为:
['刘广琦']
即保存了元组中的内容
使用正则表达式保存图片:
# 步骤分析
1.找到html文件
2.写正确的正则表达式
r'<img.+?src=\"(?P<src>.+?)\".+?>中src=后面的圆括号即子组中的内容,使用正则表达式匹配会提取该内容
3.找到src属性
import re
def find_photo_url():
with open('D:\\python\\hotgirl.html',encoding='utf-8') as f:
#读文件
html = f.read() #读取文件到html对象中
#建立正则表达式 (使用非贪婪模式的正则表达式)
pattern = re.compile(r'<img.+?src=\"(?P<src>.+?)\".+?>',re.I|re.M) #re.M不区分多行 要使用多个re属性,用或 re.I|re.M
result = pattern.findall(html)
print(len(result))
for ls in result:
ls.replace('&','&')
print(ls)
if __name__ == '__main__':
find_photo_url()
>>>>https://img1.baidu.com/it/u=640593135,209279600&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500