python 所有正则表达式
python中所有的正则表达式的函数都在r模块中
- 创建正则表达式对象
import re
re.compile(正则表达式字符串)----返回Regex对象
re.compile(r'\d\d\d\d\d')
- 匹配Regex对象
Regex对象的search()方法查找输入的字符串。寻找正则表达式的所有匹配。
Regex=re.compile(r'\d\d\d\d\d')
mo=Regex.search("要查询的字符串")
print(mo)
#mo为匹配对象,
#若未匹配到则返回None
#若匹配到 有.group()方法,返回被查找字符串实际匹配文本
#-*-coding:utf-8 -*-
import re #引入正则表达式库
regex_=re.compile(r'\d\d\d\d')#设置匹配的正则
group=regex_.search("1234asdsd3456 ")
if group==None:
print("未匹配到")
pass
else:
print(group.group())
print(type(group.group()))
>>>>>>>1234
>>>>>>><class 'str'>
>>>>>>>[Finished in 0.3s]
- 利用括号分组
正则表达式字符串中的第一对括号是第一组,第二对括号是第二组,以此类推。如要匹配电话号码
内容:regex.groups()返回匹配的元组模式,可以多重复制
regex.group()返回整体字符串匹配值
#-*-coding:utf-8 -*-
import re #引入正则表达式库
regex_=re.compile(r'(\d\d\d)-(\d\d\d)')#设置匹配的正则
group=regex_.search("123-234-34sadsd ")
if group==None:
print("未匹配到")
pass
else:
print(group.group(1))#group方法中的参数就是 第一个括号里面的匹配到的内容。若要一次性返回所有匹配值,则用groups()方法
regex1,regex2=group.groups()#使用多重赋值方式获取,返回元祖方式如:('123', '234')
print(type(group.group()))
- 用管道匹配多个分组
希望匹配许多表达式中的一个,如正则表达式:r"xxx"|“yyy”。匹配xxx或yyy
#-*-coding:utf-8 -*-
import re #引入正则表达式库
regex_=re.compile(r'xxx|yyy')#设置匹配的正则
group=regex_.search("xxx and yyy ")
if group==None:
print("未匹配到")
pass
else:
print(group.group())
>>>>>xxx
返回匹配的xxx或yyy
若需要找到“所有”匹配的地方,可以使用findall()方法,如
#-*-coding:utf-8 -*-
import re #引入正则表达式库
regex_=re.compile(r'ABC(xxx|yyy)')#设置匹配的正则
group=regex_.search("ABCxxx and yyy ")
if group==None:
print("未匹配到")
pass
else:
print(group.group())#返回ABCxxx
print(group.group(1))#返回xxx
print(group.groups())#返回('xxx',)
- 用问实现可选匹配
有时候,想匹配的模式是可选的,就是说不论文本自爱不再,正则表达式都会认为匹配。?表明它前面的分组在这个模式中是可选的,如:
#-*-coding:utf-8 -*-
import re #引入正则表达式库
regex_=re.compile(r'ABC(yyy)?')#设置匹配的正则
group=regex_.search("ABCxxx and yyy ")
if group==None:
print("未匹配到")
pass
else:
print(group.group())#返回ABC
print(group.group(1))#返回None
print(group.groups())#返回(None,)
- 用星号匹配零次或多次
*表示“匹配零次或多次”,在星号之前的分组,可以在文本中出现任意此,包括0次。或重复 。
#-*-coding:utf-8 -*-
import re #引入正则表达式库
regex_=re.compile(r'ABC(xxx)*')#设置匹配的正则
group=regex_.search("ABCxxxxxxxxxxxx and yyy ")
if group==None:
print("未匹配到")
pass
else:
print(group.group())#返回ABCxxxxxxxxxxxx
print(group.group(1))#返回xxx
print(group.groups())#返回('xxx',)
#-*-coding:utf-8 -*-
import re #引入正则表达式库
regex_=re.compile(r'ABC(yyy)*')#设置匹配的正则
group=regex_.search("ABCxxxxxxxxxxxx and yyy ")
if group==None:
print("未匹配到")
pass
else:
print(group.group())#返回ABC
print(group.group(1))#返回None
print(group.groups())#返回('None',)
- 用加号匹配一次或多次
+代表匹配“一次或多次”
#-*-coding:utf-8 -*-
import re #引入正则表达式库
regex_=re.compile(r'ABC(yyy)+')#设置匹配的正则
group=regex_.search("ABCxxxxxxxxxxxx and yyy ")
if group==None:
print("未匹配到")
pass
else:
print(group.group())
print(group.group(1))
print(group.groups())
>>>>>未匹配到
#-*-coding:utf-8 -*-
import re #引入正则表达式库
regex_=re.compile(r'ABC(yyy)+')#设置匹配的正则
group=regex_.search("ABCyyyyyyyyy and yyy ")
if group==None:
print("未匹配到")
pass
else:
print(group.group())#返回ABCyyyyyyyyy
print(group.group(1))#返回yyy
print(group.groups())#返回('yyy',)
- 用花括号匹配特定次数
如果要想一个分组重复特定次数,就在正则表达式中该分组的后面跟上花括号的数字,如:(AB){3},就匹配ABABAB字符串。
#-*-coding:utf-8 -*-
import re #引入正则表达式库
regex_=re.compile(r'(AB){3}')#设置匹配的正则
group=regex_.search("ABABABABAB and yyy ")
if group==None:
print("未匹配到")
pass
else:
print(group.group())#返回ABABAB
print(group.group(1))#返回AB
print(group.groups())#返回('AB',)
- 贪心匹配和非贪心匹配
#贪心匹配
#-*-coding:utf-8 -*-
import re #引入正则表达式库
regex_=re.compile(r'(AB){2,3}')#匹配2-3个,最大3个
group=regex_.search("ABABABABAB and yyy ")
print(group.group())
#-*-coding:utf-8 -*-
#非贪心匹配
import re #引入正则表达式库
regex_=re.compile(r'(AB){2,3}?')#只匹配2个
group=regex_.search("ABABABABAB and yyy ")
print(group.group())
- findall()方法
findall()返回结果:
1.如果调用在一个没有分组的表达式上,如\d\d,返回一个字符串列表[‘1221’,‘2121’]
2.如果调用在一个有分组的表达式中,如()-(),将返回所有匹配的字符串元祖,(‘1212’,‘222’) - 字符串分类
\d 0 到9的数字
\D 除0到9数字以外其它字符
\w 任何字母 数字 或下划线
\W 上面的反义词
\s 空格、制表符、换行符
\S 上面反义词 - 插入字符和美元字符
可以在正则表达式开始处插入符号^,表示匹配必须发送在被查找文本开始处,后面加上$ 表示被查找文本后面 - 通配字符
.它匹配处理换行字符外,所有字符。
.*是匹配所有字符
。匹配换行 - 不区分大小写匹配
re.compile(“asdas”,re.I)
15.用sub()方法替换字符串
#-*-coding:utf-8 -*-
import re #引入正则表达式库
regex_=re.compile(r'\d\d')#设置匹配的正则
# group=regex_.search("as12AasBAB45AB6sa7ABasAB and yyy ")
sd=regex_.sub('xx',"1122")
print(sd)
- 管理正则表达式
photoRegex=re.compile(r'''(
(\d{3}|\(\d{3}\))? #123 or none
(\s|-|\.)? #= or . or enter
(\d{3}) #123
(\s|-|\.) #-
(\d{4}) # 1234
(\s*(ext|x|ext)\s*(\d{2,5}))?
)''',re.VERBOSE)#re.VERBOSE这个必须要
- 组合使用
#-*-coding:utf-8 -*-
import re #引入正则表达式库
#IGNORECASW:忽略大小写 VERBOSE 编写注释
regex_=re.compile(r'\d\d',re.IGNORECASW|re.DOTALLre.VERBOSE)#设置匹
#-*- coding:utf-8 -*-
'''
1.从剪切板中获取文本
2.找出文本所有的电话号码和邮箱地址
3.将他们粘贴到剪贴板
'''
import re
import pyperclip
photoRegex=re.compile(r'''(
(\d{3}|\(\d{3}\))? #123 or none
(\s|-|\.)? #= or . or enter
(\d{3}) #123
(\s|-|\.) #-
(\d{4}) # 1234
(\s*(ext|x|ext)\s*(\d{2,5}))?
)''',re.VERBOSE)
emailRegex=re.compile(r'''
(
[a-zA-Z0-9._%+-]+#匹配任意字符串一个或多个
@
[a-zA-Z0-9]+ #用户名
(\.[a-zA-Z]{2,4})
)
''',re.VERBOSE)
match=[]
text=str(pyperclip.paste())#获取内容
for group in photoRegex.findall(text):
phone="-".join(group[1],group[2],group[3])
match.append(phone)
for group in emailRegex.findall(text):
match.append(group[0])
if len(match)>0:
pyperclip.copy('\n'.join(match))
print('\n'.join(match))
else:
print("not foud phone")