python re模块

目录


使用模块和函数

import re
content = 'My number is 415-555-4242.you number is 206-333-3210'
NumRegex = re.compile(r"\d\d\d-\d\d\d-\d\d\d\d")#返回Regex对象
res = NumRegex.search(content)#获取第一匹配
res = NumRegex.findall(content)#获取所有匹配

一、字符集

代表一类字符的通用符号
\d 代表0-9中的一个数字
\w 代表数字、字母、下划线中的一个
\s 代表空格、制表符、换行符
. 句点代表除换行符以外的所有字符

\D 非\d的一个字符
\W 非\w的一个字符
\S 非\s的一个字符

测试:

content = 'My number is 415-555-4242.you number is 206-333-3210'
NumRegex = re.compile(r"\w\s")
res = NumRegex.search(content)
print(res.group())#返回y空格
NumRegex = re.compile(r"\d\d")
res = NumRegex.search(content)
print(res.group())#返回41

二、多次重复匹配

? 零次或一次
* 零次或多次
+一次或多次
{p,q} p次到q次,包含pq,可以省略其中一个表示没有那个边界

content = 'My number is 415-555-4242.you number is 206-333-3210 a1 1a'
NumRegex = re.compile(r"\d+")
res = NumRegex.search(content)
print(res.group())#返回415,为什么不是4或者41,参见其他符号匹配
NumRegex = re.compile(r"\w*")
res = NumRegex.search(content)
print(res.group())#返回My,为什么不是空、M呢?参见其他符号匹配
NumRegex = re.compile(r"\d{4,6}")
res = NumRegex.search(content)
print(res.group())#返回4242

三、其他符号匹配

() 匹配分组,输出括号里面匹配内容
[] 符号集。匹配[]中的任意一个,[0-9a-zA-Z],匹配(0-9的数字,a-z的字母,A-Z的字母)中的一个,前面加上^表示非这些字符中的一个字符,[^a-z]表示只要不是a-z的任意一个字符
{} 重复次数
| 管道符,表示或者,前后匹配一个就行
? 非贪心匹配,默认为贪心匹配
$ 表示以前面匹配结尾
^表示以后面的字符开头

content = 'My number is 415-555-4242.you number is 206-333-3210 a1 1a'
NumRegex = re.compile(r"([a-z]\d)|(\d[a-z])")
res = NumRegex.search(content)
print(res.group())#a1
NumRegex = re.compile(r"\w*?")
res = NumRegex.search(content)
print(res.group())#打印为空,因为*表示0次或多次,而?表示非贪心匹配,匹配最短的,就是0次,为空
NumRegex = re.compile(r"^4.+5$")
res = NumRegex.search(content)
print(res.group())#不会输出415,因为以什么开始或者结束指的是content 
NumRegex = re.compile(r"^M.+a$")
res = NumRegex.search(content)
print(res.group())#输出'My number is 415-555-4242.you number is 206-333-3210 a1 1a'

三、参数指定

re.DOTALL 指定.可以匹配任意字符包括换行符
re.IGNORECASE 指定匹配不区分大小写
re.VERBOSE 忽略表达式中的空白字符忽略注释,可以分开多行表达
phoneRegex = re.compile(r’’’( #使用三引号
(\d{3}|(\d{3}))? #第一段是最外面的大括号里的东西\d{3}|(\d{3}) 两个括号转义了,所以匹配的是三个数字或者括号括起来的三个数字415或者(415)
(\s|-|.)?#空白字符,或者-或者.注意这里的.进行了转义
\d{3} # first 3 digits
(\s|-|.) # separator
\d{4} # last 4 digits
(\s*(ext|x|ext.)\s*\d{2,5})? # 0或多个空白,ext或x或者ext. 0到多个空白,2-5个数字
)’’’, re.VERBOSE)

四、search findall sub

serch((x),(y)) 返回参数res.group(x),0表示全匹配,1表示第一小块x,2表示第二个小块y

content = 'My number is 415-555-4242.you number is 206-333-3210 a1 1a'
#提取电话号码:206-333-3210
#希望输出:206-333-3210,206,206-333
reg = re.compile("(\d{3}-(\d{3}))-\d{3}0")#注意输出的时候可以括号套括号,按照左括号顺序输出
res = reg.search(content)
for i in range(3) #这里存在一个问题,不知道group中用多少项,除非从这则表达式中数括号之后+1,不能for i in res.group() 因为,res.group()默认为res.group(0),是一个全匹配
	print(res.group())

打印:
206-333-3210
206-333
333

findall 找出所有符合正则表达式的全匹配,放在list中,每一个是一个元组,有括号指定输出的话只输出括号,不输出全匹配,没有括号指定输出的话,输出全匹配。

content = 'My number is 415-555-4242.you number is 206-333-3210 a1 1a'
reg = re.compile("(\d{3}-(\d{3}))-\d{4}")
res = reg.findall(content) #[('415-555', '555'), ('206-333', '333')]
reg = re.compile("\d{3}-\d{3}-\d{4}")
res = reg.findall(content) #['415-555-4242', '206-333-3210']

sub是替换,使用指定字符串替换如把上面的content变为

content = 'My number is 4****.you number is 2**** a1 1a'
reg = re.compile("(\d)\d{2}-\d{3}-\d{4}")
res = reg.sub(r"\1****", content)#注意这个r非常重要,表示纯字符串 \1表示第一个指定输出做替换

输出 ‘My number is 4****.you number is 2**** a1 1a’

注意:使用的时候什么时候用转义,什么时候用r"“什么时候用”""

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值