'''
正则一般是用来匹配,比如电话号码和人匹配
'''
'''
re.match函数#match:re.match尝试从字符串的起始位置匹配一个模式,如果不是起始位置
函数语法:
re.match(pattern,string,flags=0)
re.search函数#search:re.search扫描整个字符串并返回第一个成功的匹配。
函数语法:
re.search(pattern,string,flags=0)
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符-可选标志
pattern:
^匹配字符串的开头
$匹配字符串的末尾。
.匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...]用来表示一组字符,单独列出:[amk]匹配'a','m'或'k'
[^...]不在[]中的字符:[^abc]匹配除了a,b,c之外的字符。
re*匹配0个或多个的表达式。
re+匹配1个或多个的表达式。
re?匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
re{n}精确匹配n个前面表达式。例如,o{2}不能匹配"Bob"中的"o",但是能匹配"food"中的两个o。
re{n,}匹配n个前面表达式。例如,o{2,}不能匹配"Bob"中的"o",但能匹配"foooood"中的所有o。"o{1,}"等价于"o+"。"o{0,}"则等价于"o*"。
re{n,m}匹配n到m次由前面的正则表达式定义的片段,贪婪方式
a|b匹配a或b
(re)匹配括号内的表达式,也表示一个组
(?imx)正则表达式包含三种可选标志:i,m,或x。只影响括号中的区域。
(?-imx)正则表达式关闭i,m,或x可选标志。只影响括号中的区域。
(?:re)类似(...),但是不表示一个组
(?imx:re)在括号中使用i,m,或x可选标志
(?-imx:re)在括号中不使用i,m,或x可选标志
(?#...)注释.
(?=re)前向肯定界定符。如果所含正则表达式,以...表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
(?!re)前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功
(?>re)匹配的独立模式,省去回溯。
\w匹配字母数字及下划线
\W匹配非字母数字及下划线
\s匹配任意空白字符,等价于[\t\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'。
,\t,等.匹配一个换行符。匹配一个制表符。等
\1...\9匹配第n个分组的内容。
\10匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。
flags:可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
re.I忽略大小写
re.L表示特殊字符集\w,\W,\b,\B,\s,\S依赖于当前环境
re.M多行模式
re.S即为.并且包括换行符在内的任意字符(.不包括换行符)
re.U表示特殊字符集\w,\W,\b,\B,\d,\D,\s,\S依赖于Unicode字符属性数据库
re.X为了增加可读性,忽略空格和#后面的注释
正则表达式实例:
实例:描述:
[Pp]ython匹配"Python"或"python"
rub[ye]匹配"ruby"或"rube"
[aeiou]匹配中括号内的任意一个字母
[0-9]匹配任何数字。类似于[0123456789]
[a-z]匹配任何小写字母
[A-Z]匹配任何大写字母
[a-zA-Z0-9]匹配任何字母及数字
[^aeiou]除了aeiou字母以外的所有字符
[^0-9]匹配除了数字外的字符
'''
importre
#search:re.search扫描整个字符串并返回第一个成功的匹配。
result=re.search('wuyanzu','wuyanzu.cn')#直接输入要匹配的字符串
print(result.group())
#match:re.match尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
result=re.match('wuyanzu','wuyanzu.cn').group()#group输出匹配的值
print(result)
a=re.match('[^asdhH]+?','woknhlj').group()#[^...]是表示不在[]中的字符:[^abc]匹配除了a,b,c之外的字符。
print(a)#+表示取一个或多个,是贪婪。+?表示非贪婪贪婪模式是把所有匹配的获取到,非贪婪模式只取到第一个匹配到的字符串
b=re.match('[a-zA-Z0-9_]*','12_3ds').group()#表示匹配到的可以是a-z或A-Z或0-9或下划线,*是取0个或多个
print(b)
b=re.match('[a-zA-Z0-9_]{4}','12_3ds').group()#表示匹配到的可以是a-z或A-Z或0-9或下划线,只取四个值
print(b)
b=re.match('[a-zA-Z0-9_]{2,5}','12_3ds').group()#匹配2-5位的值
print(b)
b=re.match('^4.*[369]$','4dfvea12453').group()#这里的^表示 匹配字符串的开头,?表示取0个或1个,$表示匹配字符串的末尾。
print(b)#match匹配从左边第一个匹配
b=re.search('4.*[369]$','24dfvea12459').group()#search匹配是从整体里找符合条件的
print(b)
c=re.match(r'[\w]{4,20}@163.com','949978171@163.com').group()#实例:匹配网易163邮箱
print(c)
mylist=['apple','banana','pen','orange']#判断匹配的数据列表里有没有,有返回数据,没有返回没有
foriinmylist:
a=re.match('apple|pen',i)#|是或者的意思
ifa:
print(a.group())
else:
print('没有')
#mylist=[]#匹配163邮箱或者126邮箱,有输出邮箱,没有输出没有
#mylist.append(input('请输入邮箱:'))
#foriinmylist:
#
#a=re.match('[\w]{4,20}@(126|163)\.com',i)
#ifa:
#print(a.group())
#print(a.group(1))
#else:
#print('没有')
mylist=['010-8989345','020-321532','0103425431','0111-3713456']#匹配显示区号与号码
foriinmylist:
a=re.match('(0[1-9][0-9]{1,2})-?(\d{6,8})',i)#()表示分组,分组的编码是从1开始
ifa:
print('区号:',a.group(1))#表示分组1的内容
print('号码',a.group(2))#表示分组2的内容
else:
print('没有找到')
mystr='c:\\a\\b\\c'
a=re.match('c:\\\\a\\\\b\\\\c',mystr).group()
print(a)
b=re.match(r'c:\\a\\b\\c',mystr).group()#r作用:使用字符串的原始意义,就不用在使用很多转义字符
print(b)
#'''匹配网页'''
#importre
#
#
#content='helloworld'
#
#obj=re.match('(.*)[a-zA-Z0-9]+>',content)
#ifobj:
#print(obj.group(1))
#else:
#print('0')
#
#
#
#
#obj=re.match('(.*)\\1>',content)#第一个\表示转义字符,第二个\1表示用group(1)
#ifobj:
#print(obj.group(2))
#else:
#print('0')
#
#
#obj=re.match(r'(.*)\1>',content)#有r就是使用原始意义
#ifobj:
#print(obj.group(2))
#else:
#print('0')
importre
content1='
helloworld'
obj=re.match('[a-zA-Z0-9]+)>[a-zA-Z0-9]+)>(.*)(?P=name2)>(?P=name1)>',content1)#分组命名格式(?P)
ifobj:
print(obj.group(3))
else:
print('0')
importre
content='我想买10斤苹果,总价2元'
obj=re.findall('\d+',content)#不用group,他直接输出是一个列表
print(obj)
print(obj[1])
a=re.sub('\d+','100',content)#对被替换的copy一份再改,对原来数据不改变
print(a)
print(content)