1. re模块方法
1.1 match()
- 定义:从字符串起始位置匹配,如果不是起始位置匹配成功就返回None
print(re.match('e','elex make love'))
结果:<_sre.SRE_Match object; span=(0, 1), match='e'>
通过group()得到匹配的字符串
1.2 search()
- 定义: 扫描整个字符串并返回第一个成功的匹配 可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None
print(re.search('e','alex make love'))
结果:<_sre.SRE_Match object; span=(2, 3), match='e'>
print(re.search('e','alex make love').group())
1.3 findall
- 定义:在字符串中找到正则表达式所匹配的所有子符串,并返回一个列表,如果没有找到匹配的,则返回空列表。
print(re.findall('e','alex make love')) #['e', 'e', 'e']
1.4 split()
print(re.split('[ab]','abcd'))
先按'a'分割得到''和'bcd',再对''和'bcd'分别按'b'分割
#['', '', 'cd']
1.5 sub()
- 定义:替换字符串的匹配项
- 语法:re.sub(pattern, repl, string, count=0, flags=0)
print(re.sub('a','A','alex make love'))
# Alex mAke love (不指定n,默认替换所有)
字符串后可以指定替换的次数
re.sub('a','A','alex make love',1)
print(re.sub('[a-z]+xx','yxp','lxx is good,sb is lllxx wxx is good cxx is good'))
#yxp is good,sb is yxp yxp is good yxp is good
phone = "2004-959-559 # 这是一个国外电话号码"
1.6 compile 函数
- 编译正则表达式,生成一个正则表达式对象
- pattern = re.compile(表达式)
pattern=re.compile('alex')
调用得到的对象pattern去匹配
print(pattern.findall('alex is SB,alex is bigSB'))
print(pattern.search('alex is SB,alex is bigSB'))
2. 特殊字符匹配
print(re.findall('\w','holle peter 123')) 匹配数字字母下划线
print(re.findall('\W','holle peter 123'))#匹配非字母数字下划线
print(re.findall('\s',"holle peter 123"))#匹配任意的空白字符
print(re.findall('\S','holle prter 123'))# 匹配任意非空字符
print(re.findall('\d','holle prter 123')) 匹配任意数字
print(re.findall('\D','holle prter 123')) 匹配任意非数字
print(re.findall('\n','holle prter 123'))匹配换行符,没有返回空列表
print(re.findall('\t','holle prter 123'))匹配制表符
print(re.findall('^h','hello egon 123')) 匹配字符串是否以h开始,是返回h,不是返回空列表
print(re.findall('3$','hello egon 123')) 匹配换行结束前的字符串是否以3结束,是返回3,不是返回空列表
3. 重复匹配 . [] * ? + {n,m}
3.1 .
匹配任意一个字符,除了换行符,被re.DOTALL指定的可以匹配任意字符
print(re.findall('a.b','a1b')) #['a1b']
print(re.findall('a.b','a1b a*b a b aaab')) #['a1b', 'a*b', 'a b', 'aab']
print(re.findall('a.b','a\nb')) #[]
print(re.findall('a.b','a\nb',re.S)) #['a\nb']
print(re.findall('a.b','a\nb',re.DOTALL)) #['a\nb']同上一条意思一样
(a.b 平移对照,a和b的位置都要对上)
3.2 []
匹配一个字符,该字符属于中括号内指定字符
print(re.findall('a[a-z]c','abc a1 c aac aAc aBc asd aaaaac a-c a/c a *c a+c abasd = a1c a2c'))
print(re.findall('a[^a-z]c','abc a1 c aac aAc aBc asd aaaaac a-c a/c a *c a+c abasd = a1c a2c'))
注:^加入中括号表示取反,除了小写字母以外全都可以
3.3 *
必须与其他字符连用,代表左侧的字符出现0次或者无穷次
print(re.findall('ab*','a ab abbb abbbb a1bbbb a-123'))
结果:['a', 'ab', 'abbb', 'abbbb', 'a', 'a']
注:*号的左侧即b位置无论有没有都取走
3.4 ?
必须与其他字符连用,代表左侧的字符出现0次或者1次
print(re.findall('ab?','a ab abbb abbbb a1bbbb a-123'))
结果:['a','ab','ab','ab','a','a']
3.5 +
必须与其他字符连用,代表左侧的字符出现1次或者无穷次
print(re.findall('ab+','a ab abbb abbbb a1bbbb a-123'))
结果:['ab','abbb','abbbb']
3.6 {n,m}
指定左侧字符出现次数的范围
print(re.findall('ab{1,3}','a ab abbb abbbb a1bbbb a-123'))
结果:['ab','abbb','abbb']
注:取左侧字符出现1次至3次的值
3.7 ()分组
print(re.findall('expression="(.*?)"','expression="1+2+3/4*5" egon="beautiful"'))
结果:['1+2+3/4*5']
在第一次匹配后再取出括号内的值
3.8 .*
贪婪匹配
print(re.findall('a.*b','a1b22222222b')) #['a1b22222222b']
3.9 .*?
非贪婪匹配
print(re.findall('a.*?b','a1b22222222b'))
3.10 |
或 两边条件有一个满足就被取出
print(re.findall('a|b', 'ab123abasdfaf'))
#['a', 'b', 'a', 'b', 'a', 'a']
#取出compan开头的字符
b='Too many companies have gone bankrupt, and the next one is my company'
print(re.findall('compan(?:ies|y)',b))
#['companies', 'company']
注:组内条件是只要满足 ies或者y 就取出,前面加一个?:表示取整体,不仅仅取组内
补充:re模块识别字符过程及转义特殊字符含义
两种方法:
print(re.findall(r'a\\c','a\c a1c aAc aac'))