python-正则

目录

Python正则表达式RE库

re库常用正则匹配方法

compile创建正则对象

元字符(metacharacters)

匹配单字符

修饰元字符

限定边界的元字符

贪婪模式与非贪婪模式

正则编译方式:表达修饰符

其他方法


用来匹配字符的一种规则,通过其中的规则选择验证判断及操作符合预期结果的字符,编程语言基本上都适用这套规则,在python中使用正则表达式是只要导入re库即可(python自带re库,不需要额外的安装)

Python官网正则表达式https://docs.python.org/3/howto/regex.html

pythonRE库:https://docs.python.org/3/library/re.html#re-syntax

正则表达式验证: https://regex101.com/

3:正则表达式;4:可以添加匹配的过滤规则;5:匹配的字符内容

在右边功能栏中有匹配的结果信息。

Python正则表达式RE库

re库常用正则匹配方法

findall() :查找与re匹配的所有子字符串,并将匹配到的对象作为列表返回

finditer() : 查找与re匹配的所有子字符串,并将匹配到的对象作为迭代器返回

match() :从字符串的起始位置匹配,如果匹配成功,则返回一个匹配对象,没有匹配成功时返回一个None值。(只能是匹配起始位置)

search():同match()方法,不同于前者的是匹配字符串任何位置上的第一个对象。

 

对于使用match()和search()方法返回的对象可以用一些方法得到这个对象匹配信息:

group():返回与re匹配的子字符串

span():返回匹配到的子字符串在源字符串中的索引位置区间(左闭右开)

start():返回匹配到的子字符串在源字符串中的起始索引

end():返回匹配到的子字符串在源字符串中的结束位置(索引+1)

import re

z = 'hello jia @456'

# m1和m2用来验证match()方法只能匹配到起始位置上的子字符串
m1 = re.match(r'el',z)
m2 = re.match(r'hel',z)
print(m1)
print(m2);print(m2.group());print(m2.start())
print(m2.end());print(m2.span())

s = re.search(r'ell',z)
print(s);print(s.group());print(s.span())
print(m2.start());print(s.end())

  

import re

z = 'hello jia @456'
# findall()匹配所有的子字符串并以列表返回
f = re.findall(r'l',z);print(f)
# findall()匹配所有的子字符串并以迭代器返回
fi = re.finditer(r'l',z)
print(fi);print(next(fi));print(next(fi))

  

compile创建正则对象

对于一些固定的正则验证可以使用两种方法,一种是直接调用re的匹配函数(将正则表达式以参数传入到函数中更为简洁),函数中的参数为正则表达式和需要匹配字符串;另一种是先创建一个正则匹配对象(使用compile类创建一个正则对象,参数为正则表达式),然后再使用这个对象的方法进行匹配(对compile类对象使用类方法时方法参数只需要传入要进行匹配的字符串)。

import re

# 直接调用re中的方法匹配
email = '265354655@qq.com'
r = r'[\d]+@[\w]+\.com'
m = re.findall(r,email)
print(m)

# 使用compile()方法先创建一个正则表达式对象,后再使用这个类的其他方法进行正则匹配
f = re.compile(r'[\d]+@[\w]+\.com')
m1 = f.findall(email)
m2 = f.match(email)
m3 = f.search(email)
print(m1);print(m2);print(m3)

  

元字符(metacharacters)

在正则表达式中代表某种类型的字符,在直接匹配时,这些字符不是匹配它本身,而是匹配它所代表的一类对象。要想匹配自身就需要使用转义符 \ ,因为正则中需要经常使用转义符,为了防止特殊字符的转义,在表达式前面一般需要用r。

匹配单字符

用来确定匹配字符的类型

.  表示要匹配除了换行符(\n)之外的任何单个字符。在具体字符后面加点,或前面加点,表示匹配这个字符后一个或前一位前一个字符。

[] 匹配指定字符([]中列举出的字符),^放在[]中表示取非括号里面的集合,具有取反的作用。不带转义符\的元字符在[]中表示字符本身。

\d 匹配0-9数字,相当于[0-9]

\D 匹配非数字符,相当于[^0-9]

\s 匹配任何空白字符,相当于[\t\n\r\f\v]

\S 匹配任何非空白字符,相当于[^ \t\n\r\f\v]

\w 匹配任何字母数字符及下划线_,相当于[a-zA-Z0-9_]或[0-z_]

\W 匹配任何非字母数字字符及下划线_,相当于 [^a-zA-Z0-9_]

修饰元字符

限定匹配字符数量的元字符:用来修饰前一个字符

* 匹配前一个字符出现的次数为0到正无穷,即需要匹配的字符可有可无

+ 匹配前一个字符出现的次数为1到正无穷,即需要匹配的字符至少出现1次

? 匹配前一个字符出现的次数为0或1次

{m} 匹配前一个字符出现的次数为m次

{m,n} 匹配前一个字符出现的次数为m到n次

{m,} 匹配前一个字符出现的次数至少为m次

限定边界的元字符

^ 匹配字符串时对开头字符进行限制,另一种同样作用的匹配/A也是匹配开头

$ 匹配字符串时对结尾字符进行限制,另一种同样作用的匹配/Z也是匹配结尾

\b 匹配一个单词的边界,零宽度的断言,仅在单词开头或结尾匹配。单词被定义为字母数字字符序列,所以单词的结尾由空格或非字母数字字符表示。

\B 匹配非单词边界,零宽度的断言,与的相反\b只在当前位置不在单词边界时匹配。

a = 'hello python,hellopythonhellopython'
print(re.findall(r'\bhello\b',a))
print(re.findall(r'\Bhello\B',a))

分组匹配

| 匹配|左右任意一个正则表达式(或的关系),注意使用|时,管道符两边不要有空格

(ab) 将每个括号中的字符作为一个分组拿出存放在元组中,圆括号——分组:正则表达式中表示组选择,每个括号中的内容为一组。组选择可以去掉用来帮助选择的字符。

import re
email = '256984369@qq.com'
r = r'((\w+)((@.+)\.com$))'
em = re.findall(r,email)
print(em)

  

贪婪模式与非贪婪模式

正则默认都是用贪婪模式匹配数据的,会尽可能多的去匹配符合要求的数据。非贪婪模式下,会匹配最短的符合要求的数据。

如下面的代码,需要将每个<>中的内容取出,使用.*或.+会匹配到最大长度的内容,这是.*和.+的贪婪模式,这时需要使用非贪婪模式,在.*或.+后面加?

import re
html = '<post><not><scr><name>'
print(re.findall(r'<.+>',html))
print(re.findall(r'<.*>',html))
print(re.findall(r'<.+?>',html))
print(re.findall(r'<.*?>',html))

  

正则编译方式:表达修饰符

re.A或re.ASCII:默认模式,Unicode模式下匹配完整的ASCII,\w,\W,\b,\B,\d,\D,\s和\S 都适用。

re.Ire.IGNORECASE:忽略区分大小写。

re.Mre.MULTILINE:多行模式,不指定时为默认为单行模式,指定后为多行模式。主要结合^ $ \A \Z的使用。

re.S或re.DOTALL:可以匹配换行符,比使用 . 匹配多了换行符。

re.Xre.VERBOSE:用于对正则的解释说明。

这些编译方式在使用时指明参数flags即可。

import re

# 不区分大小写匹配
st = 'pythonPYTHON'
print(re.compile(r'[a-z]',re.I).findall(st))
print(re.findall(r'[a-z]','pythonPYTHON',flags=re.I))

# 添加正则说明
email = '256984369@qq.com'
print(re.compile(r'''
                    ((\w+)  # 匹配邮箱中的数字
                    ((@.+)  # 匹配邮箱的类型
                    \.com$) # 匹配.com字符
                    )''',re.X).findall(email))

  

其他方法

fullmatch():匹配整个字符串并返回匹配的结果,如果整个字符串符合表达式就输出match的结果对象,否则为None。

h = '1548'
print(re.fullmatch(r'[\d]+',h))

split():通过想匹配的正则表达式来分割字符,split(pattern,string,maxsplit = 0,flags = 0 )

参数:maxsplit表示切割的次数(默认为0),没有这个参数则切取所有符合正则的字符,如果切割字符重复,会切割出空的字符。

print(re.split(r'[a-z]','123a456b789c000d258ef',maxsplit=3))
print(re.split(r'[a-z]','q123a456b789c000d258ef'))

sub():用来替换匹配到的字符,sub(pattern,repl,string,count = 0,flags = 0 )

参数:repl用来替换匹配字符的字符,count指定替换的最大次数(默认为0),如果没有这个参数则默认替换匹配到的所有字符。

print(re.sub(r'[oy]','&','python python',3))

更多用法:https://docs.python.org/3/library/re.html#re-syntax

参考网站https://www.runoob.com/python3/python3-reg-expressions.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值