目录[-]
1、元字符
(1)[]
#序列范围用法
s = "a123456b"
rule = "a[0-9][1-6][1-6][1-6][1-6][1-6]b"
l = re.findall(rule,s)
#['a123456b']
#自定义内容用法
s = "abcabcaccaac"
rule = "a[a,b,c]c"
l = re.findall(rule, s)
#['abc', 'abc', 'acc', 'aac']
#含元字符用法(元字符失效)
re.findall("caa[a,^]", "caa^bcabcaabc")
#['caa^']
#当首位为^使,为除后面内容外均匹配
re.findall("caa[^,a]", "caa^bcabcaabc")
#['caa^', 'caab']
(2)^
#匹配行首
re.findall("^abca", "abcabcabc")
#['abca']
re.findall("^abca", "5abcabcabc")
#[]首位不符合则返回空
(3) $
re.findall("abc$", "accabcabc")
#['abc']
re.findall("abc$", "accabcabc5")
#[]尾位不符合则返回空
## (4)\
#\取消转义
re.findall("^abc", "^abc123^abc") #[]
re.findall("\^abc", "^abc123^abc") #['^abc', '^abc']
#\d 匹配一个数字字符。等价于 [0-9]
re.findall("c\d\d\da", "abc123abc" #['c123a']
re.findall(r'\d','abc123456def') #['1', '2', '3', '4', '5', '6']
re.findall(r'\d+','abc123456def') #['123456']
#\D匹配一个非数字字符。等价于 [^0-9]
re.findall(r'\D','abc123456def') #['a', 'b', 'c', 'd', 'e', 'f']
re.findall(r'\D+','abc123456def') #['abc', 'def']
#\s匹配任何空白字符,包括空格、制表符、换页符等等,等价于 [ \f\n\r\t\v]
a='''abc
a
bc
a bc
a bc'''
re.findall(r"a\sbc", a) #['a\nbc', 'a\tbc', 'a bc']
print(re.findall(r"a bc", a)) #['a bc']
#\S匹配任何非空白字符。等价于 [^ \f\n\r\t\v]
re.findall(r"a\Sc", 'abc123acc456aac') #['abc', 'acc', 'aac']
#\w匹配字母数字和下划线
re.findall("\w\w\w", "abc12_") #['abc', '12_']
#\W匹配非字母数字和下划线的内容,如符号,但不含文字
re.findall(r"\W", "测试!【】{}") #['!', '【', '】', '{', '}']
(5){n}
#减少重复表达式的填写,(1)的案例修改:
l = re.findall("a[1-6]{6}b","a123456b") #['a123456b']
(6)?
#?即使没有匹配到子表达式也会有返回值,此时返回值是一个空值,因为它匹配到一个子表达式就会返回,在继续进行匹配.
s = 'faoooghooo'
re.findall('o?',s) #['', '', 'o', 'o', 'o', '', '', 'o', 'o', 'o', '']
(7)*
#*可以匹配多次,返回值是连着的子表达,它匹配不到子表达式也会返回空值。
s = 'faoooghooo'
re.findall('o*',s) #['', '', 'ooo', '', '', 'ooo', '']
(8)+
#+匹配至少一次,匹配不成功的话也不会有返回值。
s = 'faoooghooo'
re.findall('o+',s) #['ooo', 'ooo']
(9).
#匹配除 "\n" 之外的任何单个字符
re.findall(".", "010\n?!") #['0', '1', '0', '?', '!']
(10){m,n}
#m,n指的是十进制数,表示最少重复m次,最多重复n次
re.findall("010-\d{3,5}", "010-123456789") #['010-12345']
#加上?表示尽可能少的去匹配
re.findall("010-\d{3,5}?", "010-123456789") #['010-123']
(11).*?
.代表匹配除换行符\n以外的任意字符
*代表匹配0次或者多次
?惰性匹配,非贪婪性匹配,尽可能少的匹配
re.findall("aaa(.*?),", "aaa010-123456789,aaa010-223333123,") #['010-123456789', '010-223333123']
#为了匹配包含换行符号以内的内容,添加flags
re.findall("aaa(.*?),","aaa01\n0-123456789,aaa010-223333123,",flags=re.S) #['01\n0-123456789', '010-223333123']
2、正则对象方法
(1)findall()
找到re匹配的所有字符串,返回一个列表
re.findall(pattern, string, flags=0)
pattern.findall(string[, pos[, endpos]])
pattern 匹配模式。
string 待匹配的字符串。
flags 标志位,用于控制正则表达式的匹配方式
pos 可选参数,指定字符串的起始位置,默认为 0。
endpos 可选参数,指定字符串的结束位置,默认为字符串的长度。
#加上括号为仅保留括号内容
re.findall("aaa(010-\d{3,5})", "aaa010-123456789,aaa010-223333123") #['010-12345', '010-22333']
(2)search()
扫描字符串,找到这个re匹配的位置(仅仅是第一个查到的)
re.search(pattern, string, flags=0)
pattern 匹配的正则表达式
string 要匹配的字符串
flags 标志位,用于控制正则表达式的匹配方式
修饰符 | 描述 |
---|---|
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
re.search('w+', 'www.runoob.com') # 在起始位置匹配 <re.Match object; span=(0, 3), match='www'>
re.search('w+', 'runoob.com.www') # 不在起始位置匹配 <re.Match object; span=(11, 14), match='www'>
(3)match()
决定re是否在字符串刚开始的位置(匹配行首)
re.match(pattern, string, flags=0)
pattern 匹配的正则表达式
string 要匹配的字符串。
flags 标志位,用于控制正则表达式的匹配方式
re.match('w+', 'www.runoob.com') # 在起始位置匹配 <re.Match object; span=(0, 3), match='www'>
re.match('w+', 'runoob.com.www') # 不在起始位置匹配 None
3、Match object 方法
(1)group()
返回re匹配的字符串
a='123abc456'
b=re.match(r'\d+',a)
print(b.group(0)) #123
(2)start()
返回匹配开始的位置
a='abc123def456'
b=re.search(r'\d+',a)
print(b.start()) #3
(3)end()
返回匹配结束的位置
a='abc123def456'
b=re.search(r'\d+',a)
print(b.end()) #6
(4)span()
返回一个元组:(开始,结束)的位置
a='abc123def456'
b=re.search(r'\d+',a)
print(b.span()) #(3, 6)
4、re模块的函数
(1)findall()
看上文,已介绍。
(2)sub()
#sub() 函数的功能是替换字符串
#sub(正则,新字符串,原字符串)
s = "abcabcacc" #原字符串
l = re.sub("abc","ddd",s) #通过sub()处理过的字符串
print(l) #ddddddacc
(3)subn()
#subn()的作用是替换字符串,并返回替换的次数
#subn(正则,新字符串,原字符串)
s = "abcabcacc" #原字符串
l = re.subn("abc","ddd",s) #通过sub()处理过的字符串
print(l) #('ddddddacc', 2)
(4)split()
#split()分割字符串
s = "abcabcacc"
l = re.split("b",s)
print(l) #['a', 'ca', 'cacc']