python--正则表达式

import re
#概要:match、search、findall、split、sub
# match 只从字符串的开始与正则表达式匹配---如果匹配到返回match object,如果匹配失败,函数返回None
# match 方法接收3个参数,第一个是匹配的规则(正则表达式),第二个是要查找的字符串,第三个参数不是必填的,用于控制正则表达式的匹配方式.
print(re.match("yy", "yyhello"))
#>>><_sre.SRE_Match object; span=(0, 2), match='yy'>

# search 扫描整个字符串并与正则表达式匹配---如果匹配到返回match object,如果匹配失败,返回None
print(re.search("yy", "helloyy"))
#>>><_sre.SRE_Match object; span=(5, 7), match='yy'>

#findall 扫描整个字符串并与正则表达式匹配,找出所有符合项----如果匹配到返回list列表,如果匹配失败,返回空list
print(re.findall("[0-9]{1,3}","aa1x2a345aa"))
#>>> ['1', '2', '345']


#split 在匹配上的位置处进行切割 在cmd窗口中可查结果
print(re.split("[0-9]","af12gd3fdf4s"))
#>>> ['af', '', 'gd', 'fdf', 's']

#sub 将匹配上的字符串进行替换 依次为 正则表达式,新字符,字符串,替换个数,在cmd窗口中可查结果
print(re.sub("[0-9]+","|","af23ty45hj6bb",count=2))
#>>> af|ty|hj6bb


#match和search一旦匹配成功,就是一个match object对象,而match object对象有以下方法:
#group() 返回被 RE 匹配的字符串
print(re.search("yy", "helloyy").group())
#>>> yy

#group(n) 返回被 RE 匹配的字符串--其中组号为n的字符串
print(re.search("yy", "helloyy1teyy2").group(1))
#>>> yy
#start() 返回匹配开始的位置
print(re.search("yy", "helloyy").start())
#>>> 5
#end() 返回匹配结束的位置
print(re.search("yy", "helloyy").end())
#>>> 7

#span() 返回一个元组包含匹配 (开始,结束) 的位置
print(re.search("yy", "helloyy").span())
#>>> (5, 7)
#------------------------------------------正则表达式--------------------



#----------------数量词-----------------
# * 匹配*号前的字符0次或多次,只是*前面的一个字符(如下 *前是s 即可匹配t ts tss tsss 等等)
print(re.findall(r'ts*','hi1 t hi2 ts hi3 tss'))
#>>> ['t', 'ts', 'tss']

# + 匹配+号前的字符1次或多次,只是+前面的一个字符(如下 +前是s 即可匹配 ts tss tsss 等等)
print(re.findall(r'ts+','hi1 t hi2 ts hi3 tss hi4 s'))
#>>> ['ts', 'tss']

# ? 匹配?号前的字符0次或1次,只是?前面的一个字符(如下 ?前是s 即可匹配 t ts )
print(re.findall(r'ts?','hi1 t hi2 ts hi3 tss hi4 s'))
#>>> ['t', 'ts', 'ts']

# 字符{n} 匹配字符n次 (如下 匹配ss )
print(re.findall(r's{2}','hi1 t hi2 ts hi3 tss hi4 s'))
#>>> ['ss']

#'字符{n,m}' 匹配字符n到m次
print(re.findall(r's{1,2}','hi1 t hi2 ts hi3 tss hi4 s'))
#>>> ['s', 'ss', 's']

#------------------一般字符串----------------------

#'.' 默认匹配除\n之外的任意一个字符
print(re.findall(r'e.','helloyq'))
#>>> ['el']
print(re.findall(r'.....','helloyq'))
#>>> ['hello']

#'\' 转译符,前面的* + ?这样的字符都有特殊含义了,如果你想就想找它的话,那就得转译了
print(re.findall(r'\?','test????'))
#>>> ['?', '?', '?', '?']

#'[]' 字符集合,某些字符的集合,匹配的时候是这个集合里面的任意一个就行
print(re.findall(r'[ht]','abcdefgh'))
#>>> ['h']

#在[]里面如果用^的话代表取反,也就是不包括的这些字符串的
print(re.findall(r'[^abcde]','abcdefgh'))
#>>> ['f', 'g', 'h']

# + 表示1个或者多个 "."表示任意字符除\n外 本行表示e开头o结尾
print(re.findall(r"e.+o","helloyy"))
#>>> ['ello']

#------------------------边界值---------------------
# $ 表示字符串结尾字符,多行情况下匹配每一行的结尾
print(re.findall("3$","helloyy123"))
#>>> ['3']

# \Z 表示字符串结尾字符,和$不同\Z不能用于多行
print(re.findall("3\Z","helloyy123"))
#>>> ['3']

# ^ 表示字符串开头字符,,多行情况下匹配每一行的开头
print(re.findall("^h","helloyy123"))
#>>> ['h']

#\A表示字符串开头字符,和^不同的是\A不能用多行模式
print(re.findall(r"\Ah","helloyy123"))
#>>> ['h']

#-------------------预定义字符集合-----------------
#\d 匹配数字0-9
print(re.findall(r"\d+","helloyy123"))
#>>> ['123']

#\D 匹配非数字
print(re.findall(r"\D+","helloyy?123"))
#>>> ['helloyy?']

#\w 匹配字母和数字[a-zA-Z0-9]
print(re.findall(r"\w","helloYY?123"))
#>>> ['h', 'e', 'l', 'l', 'o', 'Y', 'Y', '1', '2', '3']

#\w 匹配非字母和数字
print(re.findall(r"\W","helloYY?123"))
#>>> ['?']

#'\s' 匹配空白字符、\t、\n、\r,空格
print(re.findall(r"\s","hello \n\t\rYY?123"))
#>>>[' ', '\n', '\t', '\r']

#'\S' 匹配不是空白字符、\t、\n、\r,空格
print(re.findall(r"\S","hi \n\t\rYY?123"))
#>>>['h', 'i', 'Y', 'Y', '?', '1', '2', '3']

#--------------分组分配----------------------

#'(...)' 分组匹配,把某些规则写成在一个组里,这样就可以直接对这个进行一些匹配了
#注意:分组匹配对于findall方法必须在分组内,也就是()内增加 ?:启用“不捕捉模式”,这样结果才能显示全面,否则只显示()内容
#分组匹配对于match与search方法不用在分组内增加?:
#例子1
#() 分组分配,----findall 不增加?:情况显示结果只为()内容
print(re.findall("(abc){2}","abcabctest"))
#>>> ['abc']
#() 分组分配,----findall 增加?:显示全部
print(re.findall("(?:abc){2}","abcabctest"))
#>>> ['abcabc']
#() 分组分配,----search 无影响,不增加?:显示全部
print(re.search("(abc){2}","abcabctest").group())
#>>> abcabc


#例子2
#匹配abc连续出现2次的情况,在此字符串中有1次出现abcabc
print(re.findall("(?:abc){2}","abcabctest||=||="))
#>>>['abcabc']

#匹配abc出现1次,在此字符串中有2次出现abc
print(re.findall("(?:abc){1}","abcabctest||=||="))
#>>>['abc', 'abc']

#匹配abcabc出现1次,在此字符串中有1次出现abcabc
print(re.findall("(?:abcabc){1}","abcabctest||=||="))
#>>>['abcabc']

#匹配abcabc连续出现2次的情况,在此字符串无abcabcabcabc
print(re.findall("(?:abcabc){2}","abcabctest||=||="))
#>>>[]

#例子3
print(re.findall("(?:abc){2}(?:\|\|=){2}","abcabc||=||="))
#>>>['abcabc||=||=']

#例子4
#()分组分配,寻找ip,192满足\d{1,3}形式,其余满足(.\d{1,3})形式

#如果findall方法里面有分组的话,如果想让结果正确的话就在分组最前面写上'?:',一个问号和一个冒号就好了,启用“不捕捉模式”
print(re.findall(r'\d{1,3}(?:.\d{1,3}){3}',"192.168.241.3"))
#>>>['192.168.1.3']


#--------------其他----------------------
#匹配[0-9]字符{1-3}次
print(re.findall("[0-9]{1,3}","aa1x2a345aa"))
#>>> ['1', '2', '345']

# | 匹配|左或|右的字符
print(re.findall("abc|ABC","ABCBabcCD"))
#>>> ['ABC', 'abc']


#提取成列表形式 12省34市1985年05月12日12341985----groupdict为字典形式,groupdict不能对findall使用
m=re.search("(?P<country>[0-9]{2})(?P<quyu>[0-9]{2})(?P<year>[0-9]{4})","12341985")
print(m.groupdict())
#>>> {'quyu': '34', 'year': '1985', 'country': '12'}

#-------------flags---------------------
#忽略大小写flags=re.I
print(re.findall("[a-z]+","abcABCed12345",flags=re.I))
#>>> ['abcABCed']

m=re.search(".+","\nabc\nef",flags=re.S)
print(m.group())

m=re.search(".+","\nabc\nef",flags=re.S)
print(m.group())


#支持多行查找flags=re.M
s='''
abc rw
rw test
rw hell
'''
print(re.findall('^rw',s,flags=re.M))
posted @ 2018-07-06 14:25  文城清枫  阅读(241)  评论(0编辑  收藏  举报