正则表达式

文章介绍了Python中的正则表达式基本语法,包括匹配、分组、忽略大小写、查找、搜索等功能。还详细讲解了正则表达式的非贪婪模式以及在处理字符串时如何使用编译、findall、search、group等方法。此外,提到了在实际应用中,如图片URL提取等场景的正则使用技巧。
摘要由CSDN通过智能技术生成

正则表达式

\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('&amp','&')
            print(ls)


if __name__ == '__main__':
    find_photo_url()
    
>>>>https://img1.baidu.com/it/u=640593135,209279600&amp;fm=253&amp;fmt=auto&amp;app=138&amp;f=JPEG?w=889&amp;h=500
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值