python正则表达式

正则表达式为高级的文本模式匹配、抽取、与/或文本形式的搜索和替换功能提供了基础。正则表达式描述了模式的重复或者表述多个字符.
特殊符号和字符

表示法描述
^匹配字符串开头,在多行模式匹配每一行的开头,如果放在【】里面,则表示反取
$字符串结束位置与匹配规则符合旧匹配,否则不匹配
*允许前一个字符重复0或多次
?允许前一个字符出现一次或零次
.匹配任何字符,除了\n
+允许前一个字符重复1次或无限次
|匹配|左右表达式任意一个
{m}匹配前一个字符m次
{n,m}匹配前一个字符n-m次
[ ]字符集,所有特殊字符在字符集中都将失去原有的特殊含义
[^ ]匹配到非括号里面的东西
[a-z]匹配字符集中的任意一个字母
\d+匹配任何十进制数,匹配一位或多位时用
\d相当于[0-9]
\D匹配任何非数字字符
\s匹配任何空白字符
\S匹配任何非空白字符
\w匹配任何包括下划线在内的字母数字
\W匹配任何非包括下划线在内的字母数字
r原生字符
\b匹配一个单词边缘
\B匹配一个非单词边缘
\num引用分组num匹配到的字符串
(?P)分组起别名
(?P=name)引用别名为name分组匹配到的字符串
( )使用圆括号指定分组,匹配分组里的内容

扩展表示法

|正则表达式模式|匹配的字符串|
|-|
|(?:\w+.)*|以句点结尾的字符串|
|(?#comment)|此处不做匹配,只作为注释|
|(?=.com)|如果一个字符串后面跟着.com才作匹配,并不使用任何目标字符串
|(?!.net)|如果一个字符串后面跟的不是.net才作匹配|
|(?<=800-)|如果一个字符串之前为800-才作匹配|
|(?<!192.168.)|如果一个字符串之前不是192.168才作匹配
|(?(1)y|x)|如果匹配组1存在,就与y匹配,否则就与x匹配

re模块

|函数/方法|描述|
|-|
|compile(pattern,flags=0)|使用任何可选标记来编译正则表达式的模式,然后返回一个正则表达式的对象
|match(pattern,string,flags=0)|用正则表达式模式来匹配字符串,如果匹配成功就返回匹配对象,否则返回None|
|search(pattern,string,flags=0)|使用可选标记搜索字符串中第一次出现的正则表达式模式,如果匹配成功就返回匹配对象,否则返回None|
|findall(pattern,string[,flags])|查找字符串中所有出现的正则表达式模式,并返回一个匹配列表|
|finditer(pattern,string[,flags])|与findall()函数相同,但返回的是一个迭代器,对一每一次匹配,迭代器都返回一个匹配对象
|split(pattern,string,max=0)|根据正则表达式的模式分隔符,split函数将字符串分割成列表,然后返回成功匹配的列表,分隔符最多操作max次
|sub(pattern,repl,string,count=0)|使用repl替换所有正则表达式的模式在字符串中出现的位置,除非定义count,否则就替换所有出现的位置。
|group(num=0)|返回整个匹配对象,如果定义num则返回编号为num的组
|groups(default=None)|返回一个包含所有子组的元组|
|groupdict(default=None)|返回一个包含所有匹配的命名子组字典,所有的子组名称作为字典的key键,如果没有成功匹配就返回一个空字典
complie()函数:在模式匹配之前,正则表达式模式必须编译成正则表达式对象,re.complie(),就有预编译功能,可以提升执行性能。将字符串写的正则表达式转化成模式对象,实现更有效的匹配,match和search方法也是先将字符串转化为模式在进行匹配
match()函数:match(正则模式,要匹配的字符串,匹配模式)方法判断是否匹配成功,match函数从字符串起始开始匹配,如果成功返回一个Match对象,否则返回None,在给定字符串的的开头
匹配正则表达式

# print re.match(r,'hello22')   #<_sre.SRE_Match object at 0x1ccf9f0>
# print re.match('r$','22hello') #None
#
# print re.match(r,'westos')#None
#
# print re.match('p','python')#<_sre.SRE_Pattern object at 0x7fca6cb80f30>

match()和search()的区别
search函数会在任意位置对给定正则表达式模式搜索第一次出现的匹配情况。其余特性和match()函数相同。

# #在字符串中寻找模式,在给丁字符串中寻找第一个匹配给定正则表达式的子字符串
r='hello'
print (re.match(r,'22hello22'))
print (re.search(r,'22hello22'))

运行结果:
None
<_sre.SRE_Match object; span=(2, 7), match=‘hello’>

匹配对象和组

import re

s = '<html><h1>hello</h1></html>'
pattern = r'<(\w+)><(\w+)>.*</\2></\1>'
# print(re.findall(pattern, s))
matchObj = re.match(pattern, s)
if matchObj:
    # group方法返回满足条件的所有内容;
    print(matchObj.group())
    # groups方法返回满足条件的分组内容;
    print(matchObj.groups())
    #如果分组有别名,则返回以别名为key值的字典
    print(matchObj.groupdict())

这里写图片描述

url = "http://www.westos.org/jishu/book"
pattern = r'http://(?P<domainName>.+)/(?P<type>\w+)/.+'
matchObj =  re.match(pattern, url)
if matchObj:
    print(matchObj.group())
    print(matchObj.groups())
    res = matchObj.groupdict()
    print(res)
    print(res['domainName'])

这里写图片描述

m=re.match(r'www\.(.*)\..{3}','www.python.org')
#获取给定组的匹配项
print (m.group(1))

#返回给定组的匹配项的开始位置(索引)
print (m.start(1))

#...结束索引...
print (m.end(1))

#以元组的形式返回给定组的开始和结束索引
print (m.span(1))

运行结果
python
4
10
(4, 10)
sub函数:使用给定替换内容将匹配模式的字符串替换掉

pat='D'
text='Dear {name}...'
print (re.sub(pat,'Mr.Gumby',text))

#作为替换的函数和组号
#使用complie预编码在匹配效率更高
emphasis_pattern=re.compile(r'\*([^\*]+)\*',re.VERBOSE)   #re.VERBOSE允许在模式中添加空白(空白字符,tab,换行符...)
print (re.sub(emphasis_pattern,r'<em>\1</em>','hello, *world*!'))

emphasis_pattern=r'\*\*(.+?`)\*\*'
print( re.sub(emphasis_pattern,r'<em>\1<\em>','**This** is **it**!'))

运行结果
Mr.Gumbyear {name}…
这里写图片描述
subn函数:和sub函数一样,但是subn函数会将替换的内容连同替换的次数封装成元组返回。
findall函数:和search函数一样,但是它会将匹配成功的内容放在列表里返回,如果没匹配到则返回一个空列表。
finditer函数:和findall函数一样,但他返回一个可迭代对象

import re

s='This and that'

print(re.finditer(r'(th\w+) and (th\w+)',s,re.I))
print(re.findall(r'(th\w+) and (th\w+)',s,re.I))

![这里写图片描述](https://img-blog.csdn.net/20180620164820252?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L21hc2hhb2thbmcxMzE0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值