''' 正则一般是用来匹配,比如电话号码和人匹配 ''' ''' 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]匹配除了数字外的字符
''' import re
#search:re.search扫描整个字符串并返回第一个成功的匹配。 result=re.search('wuyanzu','wuyanzu.cn')
#直接输入要匹配的字符串
print(result.group())
#match:
re.match尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
esult=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)
#|是或者的意思
if a: 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')
import re
content1=' helloworld'
obj=re.match('[a-zA-Z0-9]+)>[a-zA-Z0-9]+)>(.*)(?P=name2)>(?P=name1)>',content1)
#分组命名格式(?P)
if obj: print(obj.group(3)) else: print('0')
import re
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)