正则表达式
# 正则表达式
## 查询网址
### http://tool.chinaz.com/tools/regexgenerate
## 概念
### 正则表达式就是记录文本规则的代码
## 常用元字符
### 。
- 匹配除换行符以外的任意字符
字符串:tool.chinaz.com|888 4AB
正则表达式:。
这个可以匹配到所有字符
### \w
- 匹配字母或数字或下划线
字符串:tool.chinaz.com|888 4AB_
正则表达式:\w
这个可以匹配所有字母数字下划线,。|不能匹配上
### \s
- 匹配任意的空白符,包括空格、换行符、制表符
字符串:
abc abc abc
abc
正则:\s
结果:匹配到两个空格和一个换行
### \t
- 匹配制表符
### \n
- 匹配换行符
字符串:
abc abc abc
abc
正则:\s
结果:匹配到一个换行符
### \d
- 匹配数字
字符串:
asffgd2423ghf我hg你f7868www.baidu.comwww.tencent.com
正则:\d
结果:匹配到24237868
### \b
- 匹配单词的开始或结束
### ^
- 匹配字符串的开始
### $
- 匹配字符串的结束
字符串:
abc abc abc
abc
正则:c$
结果:
匹配到第二行那个abc
### []
- 只要在中括号内的所有字符都符合规则,可以用范围如:a-z
字符串: tool.chinaz.com|888
正则表达式:[ach1-9.|]
这个可以匹配到ach8.|
## 常用元字符反义词
### \W
- 匹配任意不是字母,数字,下划线,汉子的字符
字符串:
asffgd2423ghf我hg你f7868www.baidu.comwww.tencent.com
正则:\W
结果:匹配到除了,我你.空格
### \S
- 匹配任意不是空白的字符,包括空格、换行符、制表符
字符串:
abc abc abc
abc
正则:\S
结果:匹配到所有abc
### \D
- 匹配人员非数字的字符
字符串:
asffgd2423ghf我hg你f7868www.baidu.comwww.tencent.com
正则:\d
结果:匹配到除了24237868外的所有字符
### \B
- 匹配不是单词的开始或结束
### [^X]
- 匹配除了x以外的任意字符
str = tool.chinaz.com|888
正则表达式:[^ch8]
这个可以匹配到除了ch8以外的所有字符,这里面也可以用正则表达式 表示如:[^\d],除了数字888外其它都匹配上
## 常用限定符
### *
- 重复零次或者更多次
### +
- 重复一次或者更多次
### ?
- 重复零次或者一次
字符串
12.56
15.
正则:\w+\.?\d+
结果:
12.56
15
### {n}
- 重复n次
### {n,}
- 重复n次或者更多次
### {n,m}
- 重复n到m次
### ()
- 表示分组,给一部分正则规定为一组,|这个符号的作用域就可以缩小
### |
- 表示或
### 分组
- 分组命名
- (?P(组名)正则)
import re
s1 = "<h3>wahaha</h3>"
s2 = "<a>wahaha ya wahaha</a>"
ret = re.search("<(?P<tag>\w+)>.*?</(?P=tag)>",s2) #这里用到分组的命名和组引用
print(ret.group("tag")) #通过tag取值
print(ret.group())
结果:
a
<a>wahaha ya wahaha</a>
- 引用分组
- (?P=组名)
## 正则常用例子
### 身份证匹配
#15位 全数字 首位不位0
#18位 前17位全数字,首位不为0,最后以为是x或数字
字符串:
160025798009102775我86002519800910277x发送方式273649587326535
正则1:[1-9]\d{16}(x|\d)|[1-9]\d{14}
正则2:[1-9]\d{14}(\d{3}|\d{2}x)?
正则3:[1-9](\d{16}[\dx]|\d{14})
160025798009102775
86002519800910277x
273649587326535
### 邮编
\d{6}
### ip
(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)
### email
\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}
### 网址
^((https|http|ftp|rtsp|mms)?:\/\/)[^\s]+
### 手机号
0?(13|14|15|17|18|19)[0-9]{9}
### 中文
[\u4e00-\u9fa5]
## re
### ret = re.findall("正则表达式","字符串")
- 匹配所有符合规则的项目,以列表的方式返回
#以列表的方式返回
import re
ret = re.findall("\d+","我是1385niyao345")
print(ret)
结果:["138","345"]
注意:如果把\d后面的加号去掉返回[“1”,"3","8","3","4","5"]
### ret = re.search("正则表达式","字符串")
- 从头到尾从匹配的字符串中取出第一个符合条件的项,以对象方式返回,通过ret.group()取值
import re
ret = re.search("\d+","我是1385niyao345")
if ret:
print(ret.group())
结果:1385
### ret = re.match("正则表达式","字符串")
- 从头匹配字符串中取出第一个字符是否符合规则,符合返回对象,通过group()取值,否则返回NONE
import re
ret = re.match("\d+","45我是1385niyao345")
print(ret.group())
结果:45
注意:这里返回的45是字符串,如果字符串最前面45去掉会报错
### ret = re.finditer("正则表达式","字符串")
- 返回符合规则的迭代器,每项都是一个对象,通过group()取值,一般用在比较大的数据
import re
ret = re.finditer("\d+","45我是1385niyao345"*2000)
for i in ret:
print(i.group())
### ret = re.split("正则表达式","字符串")
- 通过符合正则表达式的字符分割,返回列表,不包含符合正则的字符,如果想包含正则的字符就在正则加分组
#这里返回的列表中不包括数字
import re
ret = re.split("\d+","45我是1385niyao345")
print(ret)
结果:['', '我是', 'niyao', '']
例2:
这里返回的列表中包括数字
import re
ret = re.split("(\d+)","45我是1385niyao345")
print(ret)
结果:['', '45', '我是', '1385', 'niyao', '345', '']
### ret = re.sub("正则表达式","替换字符串的字符","字符串")
- 通过符合表达是的字符替换成指定的字符,后面还可以传入替换的个数
import re
ret = re.sub("(\d+)","D","45我是1385niyao345")
print(ret)
结果:D我是DniyaoD
### ret = re.subn("正则表达式","替换字符串的字符","字符串")
- 通过符合表达是的字符替换成指定的字符,返回替换后的字符串和替换的数量,以元组的方式返回,后面还可以传入要替换的个数
import re
ret = re.subn("(\d+)","D","45我是1385niyao345")
print(ret)
结果:('D我是DniyaoD', 3)
### ret = re.compile()
- 预编译正则表达式,应用多次调用时减少正则编译次数
#只是预编译,其它用法一样
import re
ret = re.compile("\d+")
result = ret.findall("45我是1385niyao345")
print(result)
结果:['45', '1385', '345']
*XMind - Trial Version*
浙公网安备 33010602011771号