Python正则表达式:re模块
正则表达式(RE/regex/regexp):符合一定规则的表达式,是用于匹配字符串中字符组合的模式。
正则表达式语法
[0123456789]#[]表示这是一个字符组,代表一位字符
[0-9]#若符合规则的字符范围是连续的,可以用-,不能是9-0
[a-z]
[a-zA-Z] or [A-Za-z]
[0-9][0-9]#判断一个长度为2的字符串是否为数字
[Yy]#判断用户输入是Y/y
[Yy]es#Yes/yes
元字符
元祖父即正则表达式中有特殊意义的字符。若要表示元字符,可以加上转义字符’’。
元字符 | 描述 | l例子 |
---|---|---|
^ | 匹配输入的开始部分 | |
$ | 匹配输入的结束部分 | |
. | 除了\n以外的任意一个单个字符 | abc123@#$等等 |
[ ] | 范围 | [a-z]即小写字母中的任意一个 |
* | 0或者多次匹配前面那个字符 | 23*,可以匹配2、23、233、2333.。 |
+ | 1或者多次 | |
? | 0-或者次 | a?ve?可以匹配never中的ve |
() | 匹配模式并记住匹配项 | |
| | 或者 | x|y匹配x或y |
{n} | 精确匹配n(非负整数)次前面的字符 | 类似* |
{n,} | 至少匹配n次 | 类似+ |
{n,m} | 至少n次至多每次 | {0,1} 和?一样 |
[^abc] | 一个否定字符集 | |
\A | 仅匹配字符串开头 | |
\b | 匹配某个单词边界(单词与空格间的位置) | er\b匹配never中的er |
\B | 匹配非单词边界 | |
\d | 匹配数字 | 123467890 |
\D | 非数字 | |
\f \n \r | 依次匹配换页、换行、回车字符 | |
\s | 空白符 | 比如空格,tab键,换页字符 |
\S | 非空白符 | |
\t \v | 跳进,垂直跳进 | |
\w | 任何单词字符,包括下划线。 | 等效[A-Za-z0-9_] |
\W | 非单词 | 等效[^A-Za-z0-9_] |
\z | 仅匹配字符串的结尾 | |
\Z | 仅匹配字符串的结尾,或者结尾的换行符之前 |
限定符:指定输入中必须存在字符、组或者字符类的多少个实例才能找到匹配项。[元字符的组合]“\w[3]”可以匹配任意三位英文字母。
定位符:将正则表达式固定到行首或者行位。“^\w+”可以匹配“abc123”中的 “abc”.
分组构造:描述了正则表达式的子表达式,用于捕获输入字符串的子字符串。
用“(\w+)\s(\w+)\W”匹配字符串:He said | that that | was the | correct answer.
匹配模式:指匹配的时候使用的规则。例如,不区分大小写模式、单行模式(改变元字符“.”不会匹配换行符)、多行模式(改变"$”和"^"的匹配方式,默认为整个字符串的起始位置和结束位置)。
re模块
re模块提供了与Perl类似的正则表达式匹配操作。
正则表达式的许多元字符都需要使用反斜线表示,看也可以在定义字符串时前面添加r前缀。
" r’\n’ ’“代表字符“\”和"n”,而不是换行符。
import re
pattern=re.compile(r'\d+')#编译正则表达式,生成一个Pattern对象。匹配至少一个数字
m1=pattern.match("one123")#正则匹配。默认匹配整个字符串,只要找到一个匹配结果就返回结果。
print(m1)#None。与"o"不匹配
m2=pattern.match("one123two456",3,8)#查找字符串指定位置,匹配从位置3到5的字符
print(m2)#匹配到返回Match对象。<re.Match object; span=(3, 6), match='123'>
print(m2.group())#123
m3=re.match(r'\d+',"one123")#直接匹配,只能匹配整个字符串
print(m3)
m4=re.match(r'[a-z]+','Abcde',re.I)#使用忽略大小写
print(m4)#<re.Match object; span=(0, 5), match='Abcde'>
m5=pattern.search("one123")#search使用方法和match一致。但只要字符串中包含匹配的子串
print(m5)#<re.Match object; span=(3, 6), match='123'>。对比m1
m6=re.findall(r'\d{2}','one1234l56')#使用一致,搜索整个字符串,获取全部匹配结果
print(m6)#无论匹配是否成功都返回一个list对象。['12', '34', '56']
m7=re.split(r'[\s\,\;]+',"a,b;;c d")#分割字符串,匹配空格逗号分号。
print(m7)#['a', 'b', 'c', 'd']
s="hello 123 world 456 python"
p=re.compile(r'(\w+) (\w+)')#有个空格,没有的话不一样
m8=p.sub("hello world",s)#替换字符串
print(m8)#hello world hello world python
m9=p.sub("hello world",s,1)#只替换一次
print(m9)#hello world world 456 python
Pattern对象由re.compile() 返回
Match对象由match(),search()返回
findall()返回列表对象
分组匹配
import re
p1=re.compile(r'\d-\d-\d')#不分组
m1=p1.match("1-2-3")
print(m1)#<re.Match object; span=(0, 5), match='1-2-3'>
print(m1.groups())#返回匹配的所有组组成的元组。()
print(m1.group())#用于获得某个匹配组的字符串,默认为0,返回所有组的匹配结果。1-2-3
p2=re.compile(r'(\d)-(\d)-(\d)')#分组
m2=p2.match("1-2-3")
print(m2)#<re.Match object; span=(0, 5), match='1-2-3'>
print(m2.groups())#('1', '2', '3')
print(m2.group())#1-2-3
m3=re.findall(r'(\d)-(\d)-(\d)','1-2-3 4-5-6')
print(m3)#[('1', '2', '3'), ('4', '5', '6')]
贪婪/非贪婪匹配
贪婪/非贪婪匹配指的是尽可能多地匹配字符串还是尽可能少地匹配字符串。默认贪婪匹配(多),在限定符后面加上“?”表示非贪婪匹配。
import re
m1=re.findall(r'<.+>',r"<hello><world><python>")#贪婪
print(m1)#['<hello><world><python>']
m2=re.findall(r'<.+?>',r"<hello><world><python>")#非贪婪
print(m2)#['<hello>', '<world>', '<python>']
零宽断言
零度断言是一种零宽度的匹配,它匹配得内容不会保存到匹配结果中。表达式的匹配内容只是代表了一个位置,
字符 | 描述 |
---|---|
?= | 零宽度正预测先行断言,它断言自身出现的位置后面可以匹配后面跟的表达式 |
?<= | 正回顾后发,前面可以匹配 |
?! | 负预测先行,后面不可以匹配 |
?<! | 负回顾后发,前面不可能匹配 |
import re
s=r"eating apple seeing papper watching movie"
m1=re.findall(r'(.+?)(?=ing)',s)#正预测先行
print(m1)#['eat', 'ing apple see', 'ing papper watch']
m2=re.findall(r'(.+?)(?<=ing)',s)#正回顾后发
print(m2)#['eating', ' apple seeing', ' papper watching']
地址、手机号等正则表达式参考: 史上最全常用正则表达式大全
本文地址:https://blog.csdn.net/weixin_43931465/article/details/107056976