python-re模块

re模块

正则表达式就是字符串的的匹配规则。

常用的规则

# 匹配规则
# '.'     默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
# '^'     匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
# '$'     匹配字符结尾, 若指定flags MULTILINE ,re.search('foo.$','foo1\nfoo2\n',re.MULTILINE).group() 会匹配到foo1
# '*'     匹配*号前的字符0次或多次, re.search('a*','aaaabac')  结果'aaaa'
# '+'     匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
# '?'     匹配前一个字符1次或0次 ,re.search('b?','alex').group() 匹配b 0次
# '{m}'   匹配前一个字符m次 ,re.search('b{3}','alexbbbs').group()  匹配到'bbb'
# '{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
# '|'     匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
# '(...)' 分组匹配, re.search("(abc){2}a(123|45)", "abcabca456c").group() 结果为'abcabca45'
#
#
# '\A'    只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的,相当于re.match('abc',"alexabc") 或^
# '\Z'    匹配字符结尾,同$
# '\d'    匹配数字0-9
# '\D'    匹配非数字
# '\w'    匹配[A-Za-z0-9]
# '\W'    匹配非[A-Za-z0-9]
# '\s'     匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'
#
# '(?P<name>...)' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city")
#  结果{'province': '3714', 'city': '81', 'birthday': '1993'}

匹配规则操作:

 

# 6.匹配规则的操作
# '.'操作
print('.:', re.match('.', '12abc'))  # 1个任意字符
print('.:', re.match('..', '12abc'))  # 2个任意字符
# '^'
print('^:', re.search('^a', 'abc'))  # a开头
print('^:', re.search('^ab', 'abc'))  # ab开头
# '$'
print('$:', re.search('b$', '12abb'))  # 匹配以b结尾
# '*'
print('*:', re.search('a*', 'ABC'))   # 匹配a字符的0次或多次
print('*:', re.search('a*', 'aaaab3'))   # 匹配a字符的0次或多次
print('*:', re.search('ab*', 'aaab'))   # 匹配ab字符的0次或多次
# '+'
print('+:', re.search('ab+', 'ABC'))   # 匹配b字符的0次或多次
print('+:', re.search('ab+', 'aaaabbbbb'))   # 匹配ab字符的0次或多次
print('+:', re.search('ab+', 'aaabaaaa'))   # 匹配ab字符的0次或多次
# '?'
print('?:', re.search('ab?', 'ABC'))   # 匹配b字符的0次或1次
print('?:', re.search('ab?', 'aaaabbbbb'))   # 匹配ab字符的0次或1次
# {m}
print('m:', re.search('a{2}', 'ABC'))   # 匹配a字符的2次
print('m:', re.search('a{2}', 'aaaabbbbb'))   # 匹配a字符的2次
print('m:', re.search('a{2}', 'addaadbb'))   # 匹配a字符的2次
print('m:', re.search('.{2}', 'addaadbb'))  # 匹配任意字符2次
print('m:', re.search('[0-9]{2}', 'addaad23bb'))  # 匹配任意数字2次
# {n,m}
# [0-9][a-z]
print('n-m:', re.search('[a-z]{1,2}', 'a2blex'))  # 匹配[a-z]字符的1~10次

# | or关系
print('|', re.search('[a|A]lex', 'alex'))
print('|', re.search('[a|A]lex', 'Alex'))
# 分组匹配
print('分组:', re.search('([a-z]+)([0-9]+)', 'abc123').groups())

 

分组匹配:

 

# 分组匹配 '(?P<name>...)'
s = '1307042000005250613'

res = re.search('(?P<province>\d{3})(?P<city>\d{3})(?P<born_year>\d{4})', s).groups()
res2 = re.search('(?P<province>\d{3})(?P<city>\d{3})(?P<born_year>\d{4})', s)

print(res)  # 输出组
print(res2.groupdict())  # 生成字典

 

匹配语法:

# 匹配语法:
# re.match 从头开始匹配
# re.search 匹配包含
# re.findall 把所有匹配到的字符放到以列表中的元素返回
# re.split 以匹配到的字符当做列表分隔符
# re.sub 匹配字符并替换
# re.fullmatch 全部匹配

re.match(pattern,string,flags=0)

# 1.match 操作 re.match(pattern, string, flags=0)
# 下面返回None
s = 'abc1d3e'
print(re.match('[0-9]', s))  # 从头开始匹配
# 判断第一行第一个值必须是数字。
# 匹配到1,返回
s2 = '1a1b'
print(re.match('[0-9]', s2))

re.search(pattern,string,flags=0)

# 2.search 操作 re.search(pattern, string, flags=0)
# 开头不是数字,从字符串中搜索,匹配到1
s3 = 'abc1d3e'
print(re.search('[0-9]', s3))  # 搜索字符串,找到1个就返回

re.search 进行分组操作

操作注意:

为了避免匹配报错,可以先拿到匹配结果再进行分组操作

# 4.通过search 匹配并拿到匹配后的结果
s5 = 'abc1d3e'
res = re.search('[0-9]', s5) # 把结果存到res变量
if res: 
    print('serach_res:', res.group())  # 进行分组操作

re.findall(pattern,string,flags=0)

# 3.findall 操作
# 如果想找到所有的数字,返回列表
s4 = 'abc1d3e'
print(re.findall('[0-9]', s4))  # 搜索字符串,找到所有符合要求的值

re.split(pattern,string,maxsplit=0,flags=0)

 

# re.split 划分
s = 'alex22jack23rain32jinxin50'
print(re.split('\d+', s))   # 过滤所有的名字
print(re.findall('\d+', s))  # 过滤所有的年龄
s3 = '1-2*4/45+2'
print(re.split('[-+*/]',s3))
print(re.split('[-+*/]',s3,maxsplit=2))

re.sub(pattern,repl,string,count=0,flags=0)

 

# re.sub
print(re.sub('\d+', '_', s))  # 匹配并替换内容
print('re.sub', re.sub('\d+', '|', 'alex22wupeiqi33oldboy55',count=2))

 

re.fumatch(pattern,repl,string,count=0,flags=0)

 

# re.fullmatch
# 整个字符串匹配成功就返回er对象,否则返回None
print(re.fullmatch('abc', 'abc'))
# re.fullmatch 匹配邮箱
print(re.fullmatch('\w+\.\w+\.com', 'www.baidu.com'))

 

re.compile(pattern,flags=0)

 

# re.compile
# 用法
# 1.先把规则写好返回一个规则表达式对象
pattern = re.compile('\w+@\w+\.(com|cn|edu)')  # 先定义好匹配规则
# 2.调用时直接可以使用
print(pattern.fullmatch('abc@oldouyedu.com'))

 

Flags操作:

 

#  Flags标识符
# 1.re.I 忽略大小写
print(re.search('a','abc'))  #匹配到'a'
print(re.search('a','ABC'))  #匹配不到'a'
print(re.search('a','ABC',re.I))  #匹配到'A'

# 2.多行模式 re.MULTILINE
print(re.search('foo.$', 'foo1\nfoo2\n'))  # 匹配到foo2
print(re.search('foo.$', 'foo1\nfoo2\n', re.MULTILINE))  # 匹配到foo2

# 3.re.S
print(re.search('.', '\n'))
print(re.search('.', '\n', re.S))

# 4.re.VERBOSE  # 可以让匹配规则换行,便于添加注释
a = re.compile(r"""\d+   # 匹配数字部分
               \.        # 匹配'.'字符
               \d* """,  # 匹配数字部分
               re.X)
# 普通写法
b = re.compile(r"\d+\.\d*")

print(a.search('12.34'))
print(b.search('12.34'))

 

posted @ 2018-04-04 22:18  OYxing  阅读(215)  评论(0编辑  收藏  举报