首页 > 技术文章 > python_正则表达式

cdm023 2019-12-22 21:37 原文

line =  'cocct123'

# '^c' 代表以c开头
match_line = '^c'
if re.match(match_line,line):
     print('匹配')

#' ^c.*' 代表以c开头,任何字符结尾
match_line =' ^c.*'
if re.match(match_line,line):
     print('匹配')

# '3$' 代表以3结尾的
match_line = '3$' 
if re.match(match_line,line):
     print('匹配')

# '^c.*3$' 代表以以c开头3结尾的,中间任何字符
match_line ='^c.*3$'
if re.match(match_line,line):
     print('匹配')
import re
line =  '44cocct123'
# match_line = '^c'
match_line = '.*(c.*c).*' #这里括号代表只提取子串,.*代表可以以任何字符开头或者结尾
match_obj =  re.match(match_line,line)
if match_obj:
    print(match_obj.group(1))  # 括号里面的1代表取第一个括号里面东西
#输出:cc

上面这里为什么会出现cc的结果而不是 coc呢,实际上,这里的匹配是贪婪匹配,也就是

反向匹配的,也就是从尾到头来匹配的,那么如何使用呢,如下:

import re
line =  '44cocct123'
# match_line = '^c'
match_line = '.*?(c.*c).*' #这里问号代表从左边开始匹配
match_obj =  re.match(match_line,line)
if match_obj:
    print(match_obj.group(1))  # 括号里面的1代表取第一个括号里面东西
#输出:cocc

实际上,我要的输出coc,那么这个应该如何使用,如下,在括号里面加个问号

import re
line =  '44cocct123'
# match_line = '^c'
match_line = '.*?(c.*?c).*' #这里问号代表从左边开始匹配
match_obj =  re.match(match_line,line)
if match_obj:
    print(match_obj.group(1))  # 括号里面的1代表取第一个括号里面东西
#输出:coc

加号,+代表要最少出现一次

import re
line =  'coedct123'
# match_line = '^c'
match_line = '.*(c.+e).*' #这里是贪婪模式,从左边开始匹配,但是以c开头,c结尾,中间的任意字符必须至少出现一次,比如仅仅是
#如果字符是 'cedct123',ce则不出出现
match_obj =  re.match(match_line,line)
if match_obj:
    print(match_obj.group(1))  # 括号里面的1代表取第一个括号里面东西
#输出:coe

大括号里面包含的数字 {2} ,最少出现两次

或者 {2,}:最少出现两次以上

或者 {2,5}:最少2次,最多5次

import re
line =  'cweedct123'
# match_line = '^c'
match_line = '.*(c.{2}e).*' #这里的 {2}代表两个字符之间的字符必须出现2次
match_obj =  re.match(match_line,line)
if match_obj:
    print(match_obj.group(1))  # 括号里面的1代表取第一个括号里面东西
#输出:cwee

 

| 代表只要或的关系,例如 字符串 '(baby|baby22)',只要满足一边即可

import re
line =  'baby is smail'
# match_line = '^c'
match_line = '(test|baby|xx)' #只要里面有包含baby的都提取出来
match_obj = re.match(match_line,line) if match_obj: print(match_obj.group(1)) # 括号里面的1代表取第一个括号里面东西 #输出:baby

[],中括号里面的字符只要满足任意一个即可,也可以写区间,[abcd]可以写成[a-d]

另外需要注意的是 进入中括号的字符都代表字符本身,[.*] 这里已经不具备其他含义,

就是.*号本身了

import re
line =  'baby is smail'
match_line = '([abcd]aby is smail)' #这里的代表只要字符串中的开头只要是abcd中任意一个即可匹配
match_obj =  re.match(match_line,line)
if match_obj:
    print(match_obj.group(1))  # 括号里面的1代表取第一个括号里面东西
#输出:baby is smail  ,如果match_line = '([apcd]aby is smail)',则不输出

 

import re
line =  '13766666666'
match_line = '(1[35478][^a-z]{9})' #这里的代表1开头,第二个任意为35478中的一个,不等于a-z中的任何一个,出现9次
match_obj =  re.match(match_line,line)
if match_obj:
    print(match_obj.group(1))  # 括号里面的1代表取第一个括号里面东西
#输出:13766666666

 

 \ 反斜杠的用途 :

\s :小s的意思的就是中间为空格

\S: 如果是\S则不为空格

\w: 代表为任意字符,但是跟  .* 不一样,与中括号的 [a-zA-Z0-9_]的一样

 \W 大的W的就是与小的 \w的作用相反

 

 固定用法:[\u4E00-\u9FA5] 只提取汉字,

import re
line =  'study by 南京大学'
match_line = '.*?([\u4E00-\u9FA5]+大学)' 
match_obj =  re.match(match_line,line)
if match_obj:
    print(match_obj.group(1))  # 括号里面的1代表取第一个括号里面东西
#输出:南京大学

\d:代表数字

import re
line =  'xxx出生与2001年'
match_line ='.*?(\d+)'  # '.*(\d+4})'
match_obj =  re.match(match_line,line)
if match_obj:
    print(match_obj.group(1))  # 括号里面的1代表取第一个括号里面东西
#输出:2001

 

 

 小作业,匹配全部的

import re
# line =  'xxx出生与2001年6月1日'
# line =  'xxx出生与2001年6月'
# line =  'xxx出生与2001-6-1'
# line =  'xxx出生与2001-06-01'
# line =  'xxx出生与2001-6'
line =  'xxx出生与2001/6/1'
match_line ='.*?出生与(\d{4}[年/-]\d{1,2}([月/-]\d{1,2}[日]|[月/-]\d{1,2}|$|[月/-]$))'
match_obj =  re.match(match_line,line)
if match_obj:
    print(match_obj.group(1))  # 括号里面的1代表取第一个括号里面东西

 

 

推荐阅读