正则表达式re库 python3

正则表达式re库 python3

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。

import re

(一)函数

re.match函数
## re.match(pattern, string, flags=0)
# 匹配成功re.match方法返回一个匹配的对象,否则返回None。
# 我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
参数:
pattern	匹配的正则表达式
string	要匹配的字符串。
flags	标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志

# 不在起始位置开始匹配
a = re.match('www', 'www.baidu.cn')
print(a)  # <re.Match object; span=(0, 3), match='www'>

# 不在起始位置开始匹配
b = re.match('cn', 'www.baidu.cn')  # 会返回None
print(b)

# 实例2
line = 'Cats are smarter than dogs'
matchObj = re.match(r'(.*) are (.*?) .*', line, re.M | re.I)
print(matchObj)  # <re.Match object; span=(0, 26), match='Cats are smarter than dogs'>

if matchObj:
    print("matchObj.group():", matchObj.group())  # matchObj.group(): Cats are smarter than dogs
    print("matchObj.group(1):", matchObj.group(1))  # Cats
    print("matchObj.group(2):", matchObj.group(2))  # smarter
else:
    print("No match!!")
re.search方法
## re.search(pattern, string, flags=0)
# 扫描整个字符串并返回第一个成功的匹配,没有返回None
# 我们可以使用group(num) 和groups() 匹配对象函数来获取匹配表达式

# 在起始位置匹配
e = re.search('www', 'www.w3school.cn').span()  # (0,3)
print(e)

# 不在起始位置匹配
f = re.search('cn', 'www.w3cschool.cn').span()  # (14,16)
print(f)

# 实例2
line = "Cats are smater than dogs"

searchObj = re.search(r'(.*) are (.*?) .*', line, re.M | re.I)  
# re.M多行匹配,影响 ^ 和 $ e.I忽略大小写
# r'(.*) are (.*?) .*'
# 首先,这是一个字符串,‘r’表示让编译器忽略反斜杠转义字符
# (.*) 第一个分组匹配, ',*'代表匹配从换行符之外的所有字符,贪婪
# (.*?) 第二个分组匹配,‘?’代表非贪婪,只匹配符合条件最少的字符
# 后面一个‘.*’没有括号,所以不是分组,匹配效果和第一个一样,但是不计入匹配结果中。


if searchObj:
    print(searchObj.group())  # Cats are smater than dogs
    print(searchObj.group(1))  # Cats
    print(searchObj.group(2))  # smater
else:
    print("nothing found!!")
re.match与re.search的区别

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

re.sub检索和替换
## 检索和替换 re.sub
# re.sub(pattern, repl, string, max=0) # 原始字符串在后面

# 参数
pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配


phone = "2014-955-559 # 这是一个电话号码"
# 删除注释
num = re.sub(r'#.*$', '', phone)  # 2014-955-559
print(num)

# 删除非数字内容
num = re.sub(r'\D', '', phone)  # 2014955559
print(num)

# repl是一个参数
# 以下实例中将字符串中匹配的数字乘以2
print('repl 厉害用法')


def double(matched):  # 注意这里的传参用法
    value = int(matched.group('value'))
    return str(value * 2)


s = 'A23G4HFD567'
g = re.sub(r'(?P<value>\d+)', double, s)  # A46G8HFD1134 数字都乘以了2
print(g)

re.compile 函数
## re.compile函数
# re.compile(pattern[, flags])
# compile函数用于编译正则表达式,生成一个正则表达式(Pattern)对象,、
# 供match()和search()这两个函数使用

pattern = re.compile(r'\d+')  # 至少一个数字
m = pattern.match('one12twothree34four')  # 从头开始匹配 None
print(m)

m = pattern.match('one12twothree34four', 3, 10)  # 从第四个位置开始皮配
print(m)  # <re.Match object; span=(3, 5), match='12'>
print(m.group())  # 12 字符串 注意:match出来的要用group取
print(m.start())  # 起始位置 3
print(m.end())  # 结束位置 5
print(m.span())  # 位置区间(3,5)
findall
## findall 返回列表或空列表
# 注意:match和search是匹配一次,findall是匹配所有
# findall(string[, pos[, endpos]])
pattern = re.compile(r'\d+')
result1 = pattern.findall('runoob 123 google 456')  # ['123', '456']
result2 = pattern.findall('run88oob123google456', 0, 10)  # ['88', '12']
print(result1)
print(result2)
re.finditer
## re.finditer
# 和findall类似,作为迭代器返回
# re.finditer(pattern, string, flags=0)
iter1 = re.finditer(r'\d+', "12a32bc43jf3")
for match in iter1:
    print(match.group())

    # 12
    # 32
    # 43
    # 3
re.split
## re.split 返回列表
# re.split(pattern, string[, maxsplit=0, flags=0])
参数	描述
pattern	匹配的正则表达式
string	要匹配的字符串。
maxsplit  分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。
flags	标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志

aa = re.split('\W+', 'runoob。 runoob。 runoob.')  # ['runoob', 'runoob', 'runoob', '']
print(aa)

bb = re.split('(\W+)', 'runoob, runoob, runoob.')  # ['runoob', ', ', 'runoob', ', ', 'runoob', '.', '']
print(bb)

cc = re.split('\W+', 'runoob, runoob, runoob.', 1)  # ['runoob', 'runoob, runoob.']
print(cc)

# 菜鸟上说:对于一个找不到匹配的字符串而言,split不会对其做出分割
# 但是: 事实是,全分割了
dd = re.split('a*', 'hello world')  # ['', 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '']
print(dd)
补充:分组匹配’(?P<…>…)’
## '(?P<...>...)'分组匹配

s = '1102231990xxxxxxxx'
res = re.search('(?P<province>\d{3})(?P<city>\d{3})(?P<born_year>\d{4})',s)
dict1 = res.groupdict()  # 以字典形式输出 {'province': '110', 'city': '223', 'born_year': '1990'}
print(dict1)

(二)正则表达式对象

# 正则表达式对象
# re.RegexObject  re.compile()返回RegexObject对象
# re.MatchObject  group()返回RE匹配的字符串
# start() 返回开始匹配的位置
# end() 返回匹配结束的位置
# span() 返回一个元组,包含匹配(开始,结束)的位置

(三)正则表达式修饰符-可选标志

re.I	使匹配对大小写不敏感。
re.M	多行匹配,影响^和$。
re.S	使.匹配包括换行在内的所有字符。

re.L	做本地化识别(locale-aware)匹配。
re.U	根据Unicode字符集解析字符,影响\w,\W,\b,\B。
re.X	该标志通过给予你更灵活的格式以便你将正则表达式写的更易于理解。

(四)正则表达式模式

模式字符串使用特殊的语法来表示一个正则表达式:

字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。

多数字母和数字前加一个反斜杠时会拥有不同的含义。

标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。

反斜杠本身需要使用反斜杠转义。

由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r’\t’,等价于 ‘\t’)匹配相应的特殊字符。

下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。



^	匹配字符串的开头。
$	匹配字符串的结尾。
.	匹配任意字符,除了换行符,re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。

[...]	用来表示一组字符,如单独列出:[amk]匹配'a','m''k'[^...][]的字符,如[^abc]匹配除了'a','b','c'以外的字符。

...*	匹配0个或多个表达式。
...+	匹配1个或多个表达式。
...?	匹配0个或1个由前面正则表达式定义的片段,非贪婪方式。

...{n}	精确匹配n个前面表达式,例如,o{2}不能匹配"Bob"中的"o",但能匹配"food"中的两个"o"...{n,}	匹配前面n个表达式,例如,"o{1,}"等价于"o+","o{0,}"等价于"o*",o{2}不能匹配"Bob"中的"o",但能匹配"foooood"中的所有"o"...{n,m}	匹配n到m次由前面的正则表达式定义的片段,贪婪方式。
a|b	匹配a或b

(...)	匹配括号内的表达式,也表示一个组
(?imx)	正则表达式包含三种可选标志:i,m或x,只影响括号中的区域。
(?-imx)	正则表达式关闭i,m,x可选标志,只影响括号中的区域。

(?:...)	类似(...),但是不表示一个组。
(?imx:...)	在括号中使用i,m或x的可选标志。
(?-imx:...)	在括号中不使用i,m或x的可选标志。

(?#...)	注释。
(?= re)	前向肯定界定符。如果所含正则表达式,以 ... 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
(?! re)	前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功
(?> re)	匹配的独立模式,省去回溯。
 
\w	匹配字母、数字、下划线。
\W	匹配非字母、数字、下划线。
\s	匹配任意空白字符,等价于[\t\n\r\f]。
\S	匹配任意非空字符。
\d	匹配任意数字,等价于[0-9]。
\D	匹配任意非数字

\A	匹配字符串开始
\Z	匹配字符串结束,如果存在换行,只匹配到换行前的结束字符串。
\z	匹配字符串结束。
\G	匹配最后匹配完成的位置。
 
\b	匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B	匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
 
\n,\t,.	匹配一个换行符。匹配一个制表符。等。
\1...\9	匹配第n个分组的内容。
\10	匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。


(五)常用正则表达式

1.中文字符
[\u4e00-\u9fa5]

说明:目前主流计算机底层的编码系统都是Unicode,而在Unicode标准中,汉字表的第一个编码为U+4e00,最后一个编码为U+9fa5,所以[\u4e00-\u9fa5]就代表匹配任意一个Unicode编码表中存在的汉字。
2.双字节字符
[^\x00-\xff]

说明:\x代表十六进制形式,2个字节长度的十六进制最大范围为00-ff,所以[^\x00-\xff]表示匹配长度为双字节的字符。
3.空白行
\n\s*\r

说明:这个表达式表示匹配内容中的空白行,比如一个txt由多行文字组成,并且句子与句子之间存在空白行,这个正则表达式便能加以区分。
首先,
\n表示匹配一个换行符,
而\s*代表匹配任意的空白符,
\r表示匹配任意的回车符。
4.Email地址
\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}

或者:
[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?
示例:
wddpct@gmail.com,wdd.pct@gmail.com,wddpct-pct@gmail.com
 
或者:
/^([0-9A-Za-z]+[-_\.]*[0-9A-Za-z]+)@([0-9A-Za-z]+\.[A-Za-z]{2,3}(\.[a-zA-Z]{2,3})?)$/
说明:
 由于不能以特殊符号开始或结束,所以[-_\.]*前后的表达式是"+",特殊符号的前后至少要有一个字符,
 邮箱的后缀由两部分或三部分组成,所以最后的(\.[a-zA-Z]{2,3})?是可选内容,这里的"?"表示范围0-1(即0次或1次)。
 
5.网页URL
^((https|http|ftp|rtsp|mms)?:\/\/)[^\s]+

或者
[a-zA-Z]+:\/\/[^\s]*

说明:
[a-zA-Z]+表示匹配任意长度字符串,并且字符串包含的字符只能是a和z或者A和Z之间的字母。
‘:\/\/’表示匹配“://”字符串。
[^\s]*表示匹配任意长度的不包含非空字符的字符串。
6.手机(国内)
0?(13|14|15|18|17)[0-9]{9}
7.电话(国内)
\d{3}-\d{8}|\d{4}-\{7,8}

说明:‘|’将匹配条件分为两部分。
\d{3}-\d{8}代表匹配xxx-xxxxxxxx数字形式的号码。
右边的\d{4}-\d{7,8}代表匹配xxxx-xxxxxxx或者xxxx-xxxxxxxx数字形式的号码。
8.腾讯QQ号
[1-9]([0-9]{4,10})
9.邮政编码
[1-9]\d{5}(?!\d)

说明:
[1-9]表示匹配不为零的任意数字。
(?!)表示零宽断言的一种语法,又称零宽度负预测先行断言,表示位置的后面不能匹配表达式。
所以\d{5}(?!\d)表示匹配5位数字,而且这5位数字的后面不能是数字。
示例: 65900719951006773X
10.IP
(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)

或者:
\d+\.\d+\.\d+\.\d+ (提取IP地址时有用)
11.身份证号
^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$

说明:这段正则虽然很长,其实表达的意思也非常简单。
\d{6}代表匹配6位数字,
\d{4}代表匹配4位数字,
\d{2}代表匹配2位数字,
\d{3}代表匹配3位数字,
最后的[0-9]|X代表匹配09的任意数字,或者匹配X字母。


或者
\d{17}[\d|x]|\d{15}
12.格式日期
\d{4}(\-|\/|.)\d{1,2}\1\d{1,2}
13.匹配整数
-?[1-9]\d*
14.正整数
^[1-9]\d*$

说明:
[1-9]表示首位匹配19的任意数字,
\d*代表从第二位开始可以为空,不为空时必须为数字。
15.负整数
^-[1-9]\d*$
16.匹配非负整数
^[1-9]\d*|0$

说明:
非负整数包括0和正整数
17.正浮点数
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$

说明:
[1-9]\d*\.\d*代表匹配格式形如“正整数.数字”的字符串,
中间用|代表或条件,
0\.\d*[1-9]\d*$ 代表匹配格式形如“0.数字”的字符串。
18.负浮点数
^-[1-9]\d*\.\d*|-0\.\d*[1-9]\d*$
19.用户名
[A-Za-z0-9_\-\u4e00-\u9fa5]+[A-Za-z0-9_\-\u4e00-\u9fa5]+


或者:
2-14个英文或2-7个汉字(数字、下划线)
/^([\u4e00-\u9fa5\d_]{2,7})$|^([a-zA-Z0-9_]{2,14})$/

注:该文为整合笔记(菜鸟教程+w3cschool+csdn+简书)。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值