在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用一个模块,名字为re
1. re模块的使用过程
#coding=utf-8
# 导入re模块
import re
# 使用match方法进行匹配操作
result = re.match(正则表达式,要匹配的字符串)
# 如果上一步匹配到数据的话,可以使用group方法来提取数据
result.group()
re.match是用来进行正则匹配检查的方法,若字符串匹配正则表达式,则match方法返回匹配对象(Match Object),否则返回None(注意不是空字符串"")。
匹配对象Macth Object具有group方法,用来返回字符串的匹配部分。
2. re模块示例(匹配以cellboxer开头的语句)
#coding=utf-8
import re
result = re.match("cellboxer","cellboxer.com")
result.group()
运行结果为:cellboxer
3.表示字符
字符 | 功能 |
---|---|
. | 匹配任意1个字符(除了\n) |
[ ] | 匹配[ ]中列举的字符 |
\d | 匹配数字,即0-9 |
\D | 匹配非数字,即不是数字 |
\s | 匹配空白,即 空格,tab键 |
\S | 匹配非空白 |
\w | 匹配单词字符,即a-z、A-Z、0-9、_ |
\W | 匹配非单词字符 |
示例1: . 匹配任意1个字符(除了\n)
ret = re.match('.','a')
ret.group()
'a'
ret = re.match('.','ab')
ret.group()
'a'
示例2:\d 匹配数字,即0-9
ret = re.match('\d','110')
ret.group()
'1'
示例3:\D 匹配非数字,即不是数字
ret = re.match('\D','@')
ret.group()
'@'
示例4:\s 匹配空白,即 空格,\t,\r ,\n
import re
ret = re.match('\s',' ')
ret.group()
' '
ret = re.match('\s','\t')
ret.group()
'\t'
ret = re.match('\s','\r')
ret.group()
'\r'
ret = re.match('\s','\n')
ret.group()
'\n'
示例5: \S 匹配非空白
ret = re.match('\S','a')
ret.group()
'a'
示例6: \w 匹配单词字符,即a-z、A-Z、0-9、_
ret = re.match('\w','Abcd')
ret.group()
'A'
示例7:匹配[ ]中列举的字符
ret = re.match('1[345678]','13')
ret.group()
'13'
ret = re.match('1[^345678]','19')
ret.group()
'19'
ret = re.match('1[a-z5-9]','1b')
ret.group()
'1b'
4 表示数量
匹配多个字符的相关格式
字符 | 功能 |
---|---|
* | 匹配前一个字符出现0次或者无限次,即可有可无 |
+ | 匹配前一个字符出现1次或者无限次,即至少有1次 |
? | 匹配前一个字符出现1次或者0次,即要么有1次,要么没有 |
{m} | 匹配前一个字符出现m次 |
{m,} | 匹配前一个字符至少出现m次 |
{m,n} | 匹配前一个字符出现从m到n次 |
示例1:*
需求:匹配出,一个字符串第一个字母为大小字符,后面都是小写字母并且这些小写字母可有可无
#coding=utf-8
import re
ret = re.match("[A-Z][a-z]*","Mm")
ret.group()
ret = re.match("[A-Z][a-z]*","Aabcdef")
ret.group()
image
示例2:+
#coding=utf-8
import re
ret = re.match("[a-zA-Z_]+[\w_]*","name1")
ret.group()
'name1'
ret = re.match("[a-zA-Z_]+[\w_]*","_name")
ret.group()
'_name'
示例3:?
需求:匹配出,0到99之间的数字
#coding=utf-8
import re
ret = re.match("[1-9]?[0-9]","7")
ret.group()
示例4:{m}
需求:匹配出,8到20位的密码,可以是大小写英文字母、数字、下划线
ret = re.match("[a-zA-Z0-9_]{8,20}","1ad12f23s34455ff66")
ret.group()
5.表示边界
字符 | 功能 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
\b | 匹配一个单词的边界 |
\B | 匹配非单词边界 |
示例1:$
需求:匹配手机号码
ret = re.match('1[3,4,5,7,8]\d{9}$','13500000000')
ret.group()
'13500000000'
6.匹配分组
字符 | 功能 |
---|---|
1 | 匹配左右任意一个表达式 |
(ab) | 将括号中字符作为一个分组 |
\num | 引用分组num匹配到的字符串 |
(?P<name>) | 分组起别名 |
(?P=name) | 引用别名为name分组匹配到的字符串 |
示例1:|
需求:匹配出0-100之间的数字
import re
while True:
num = input('请输入\n')
ret = re.match(r'[1-9]\d?$|0$|100$', num)
try:
result = ret.group()
print('match result:',result)
except AttributeError:
print('not match!')
示例2:( )
需求:匹配出163、126、qq邮箱之间的数字
while True:
text = str(input('请输入\n'))
ret = re.match(r'\w{4,20}@(163|126|qq)\.com', text)
try:
result = ret.group()
print('match result:',result)
except AttributeError:
print('not match!')
示例3:\number
需求:
匹配出 <html><h1>xiangzige</h1></html>
ret = re.match(r'<(\w*)><(\w*)>.*</\2></\1>','<html><h1>xiangzige</h1></html>')
try:
result = ret.group()
print('match result:',result)
except AttributeError:
print('not match!')
示例4:(?P<name>) (?P=name)
需求:匹配出<html><h1>xiangzige</h1></html>
rule1 = r'<(\w*)><(\w*)>.*</\2></\1>'
rule2 = r'<(?P<key1>\w*)><(?P<key2>\w*)>.*</(?P=key2)></(?P=key1)>'
ret = re.match(rule2,'<html><h1>xiangzige</h1></html>')
try:
result = ret.group()
print('match result:',result)
except AttributeError:
print('not match!')
re模块的高级用法
search
需求:匹配出文章阅读的次数
#coding=utf-8
import re
ret = re.search(r"\d+", "阅读次数为 9999")
ret.group()
findall
需求:统计出python、c、c++相应文章阅读的次数
#coding=utf-8
import re
ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345")
print ret
sub 将匹配到的数据进行替换
需求:将所有语言改为python
import re
result = re.sub(r'\w+(\s+|\b)','python ','java ios php js')
print(result)
split 根据匹配进行切割字符串,并返回一个列表
需求:切割字符串“info:xiaoZhang 33 shandong”
#coding=utf-8
import re
ret = re.split(r":| ","info:xiaoZhang 33 shandong")
print ret
网友评论