python进阶之正则表达式
一、什么是正则表达式?
顾名思义,正则表达式是一个表达式,这个表达式可以表示符合一定的规则字符串。
它是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
通过它的语法,你可以十分方便的查找到符合一定规律的字符串。
正则表达式在许多语言都可以使用,语法都是相同的。但需要导的包或模块可能不同。
本文以python演示,在python中,提供了re模块让我们能使用正则表达式。re模块内也提供了许多方法,可简便我们的操作。
二、正则表达式的用途。
-
用于各种数据的校验:
如 密码强度校验、手机号,用户名格式校验、电子邮件地址校验、身份证号校验等等。 -
用于查找有特定规律的数据:
如:在规模庞大的数据中查找电话号码,银行卡号,车牌号,用户名等。 -
用于替换有特定规律的数据:
如: 将数据中所有的电话号都替换为*号等。
既然正则表达式可以查找匹配符合一定特征的数据,那自然可以对这些数据进行增删改查。
三、正则表达式的语法。
常见语法:
点 . 匹配所有的字符。
. 表示要匹配除了换行符之外的任何单个字符。
代码示例:
import re
content = "绿色是生机的颜色,我不喜欢红色,但我喜欢蓝色"
x = re.compile(r'.色') # 匹配 某个字符 加上 色
for i in x.findall(content):
print(i)
'''结果:
绿色
颜色
红色
蓝色
'''
*号表示匹配前面的子表达式任意次,包括0次。
import re
content = "绿色是生机的颜色,我不喜欢红色,但我喜欢蓝色"
x = re.compile(r',.*') # 匹配 ,加上任意字符匹配0--任意次。
for i in x.findall(content):
print(i)
'''结果:
,我不喜欢红色,但我喜欢蓝色
'''
+ 表示匹配前面的子表达式一次或多次,不包括0次。
? 表示匹配前面的子表达式0次或1次。
花括号{ }表示 前面的字符匹配 指定的次数 。
注意 :‘ * ’, ‘+’, ‘?’ 都是贪婪地,使用他们时,会尽可能多的匹配内容。
使用非贪婪模式,需要在‘*’, ‘+’, ‘?’ 后面加上 ?
对元字符的转义:
反斜杠 \ 加上特殊字符。
如: 反斜杠 \加上* 代表 星号*。
反斜杠后面接一些字符,表示匹配 某种类型 的一个字符。
如:
\d 匹配0-9之间任意一个数字字符,等价于表达式 [0-9]
\D 匹配任意一个不是0-9之间的数字字符,等价于表达式 [^0-9]
\s 匹配任意一个空白字符,包括 空格、tab、换行符等,等价于表达式 [\t\n\r\f\v]
\S 匹配任意一个非空白字符,等价于表达式 [^ \t\n\r\f\v]
\w 匹配任意一个文字字符,包括大小写字母、数字、下划线,等价于表达式 [a-zA-Z0-9_]
缺省情况也包括 Unicode文字字符,如果指定 ASCII 码标记,则只包括ASCII字母
\W 匹配任意一个非文字字符,等价于表达式 [^a-zA-Z0-9_]
反斜杠也可以用在方括号里面,比如 [\s,.] 表示匹配 : 任何空白字符, 或者逗号,或者点
方括号表示要匹配 指定的几个字符之一 :
比如
[abc] 可以匹配 a, b, 或者 c 里面的任意一个字符。等价于 [a-c] 。
[a-c] 中间的 - 表示一个范围从a 到 c。
如果你想匹配所有的小写字母,可以使用 [a-z]
一些 元字符 在 方括号内 失去了魔法, 变得和普通字符一样了。
比如
[akm.] 匹配 a k m . 里面任意一个字符
这里 . 在括号里面不在表示 匹配任意字符了,而就是表示匹配 . 这个 字符
如果在方括号中使用 ^ , 表示 非 方括号里面的字符集合。
起始、结尾位置 和 单行、多行模式
^ 表示匹配文本的 开头 位置。
正则表达式可以设定 单行模式 和 多行模式
如果是 单行模式 ,表示匹配 整个文本 的开头位置。
如果是 多行模式 ,表示匹配 文本每行 的开头位置。
$ 表示匹配文本的 结尾 位置。
如果是 单行模式 ,表示匹配 整个文本 的结尾位置。
如果是 多行模式 ,表示匹配 文本每行 的结尾位置。
竖线 | 表示 匹配 其中之一 。
括号()称之为 正则表达式的 组选择。