这下女友总算满意了!
文 | 極光
来源:Python 技术「ID: pythonall」
上次跟女友介绍了正则表达式的基本语法,以及在 Python
中如何使用。结果她还不满意,说传说中的正则表达式就这么简单?当然不是,今天就来跟大家一起介绍下正则表达式更多的使用技巧。
小括号,大作用
一般用于获取
()
中的正则内容进行下一步操作使用,如果想要关闭这种获取能力,可以在左括号(
后面加上?:
就可以了。另一个作用就是让括号内正则表达式进行组合,方便使用之前介绍的
?* +
等,还有或操作符|
。
当获取了小括号里的内容后,我们也可以反向引用 ()
里的内容,每一个小括号里的内容,只要没有使用 ?:
,就会被分配一个组号,从左到右从1开始递增。
在使用中,可以使用 \i
引用前面 ()
里获取的内容。
除了上面使用索引的方式反向引用外,还可以使用组名的方式引用。
也就是通过左括号 (
后面跟一个字串 ?P<组名>
的方式,来为这个组起一个别名,后面就可以通过 (?P=组名)
来引用这个组获取的内容了。例如想要匹配重复数字,可以使用 (?P<key>\d+)\s+(?P=key)
。
断言
在实际使用中,我们需要对正则表达式使用断言,来对文本进行部分约束,但断言不会匹配任何文本。
断言 | 说明 |
---|---|
\b | 匹配单词的边界 |
\B | 匹配非单词边界,会受到ASCII标记影响 |
\A /^ | 从开始位置匹配, 如有MULTILINE标志,则^ 会在每个换行符后匹配 |
\Z /$ | 在结束位置匹配,如有MULTILINE标志,则$ 在每个换行符前匹配 |
另外还有些特殊的,如正前瞻、负前瞻、正回顾、负回顾:
正前瞻(?=e):如 表达式1(?=表达式2) 表达式3
,则表式后面的内容需要匹配表达式2;负前瞻(?!e):如 表达式1(?!表达式2) 表达式3
,则表式后面的内容不能匹配表达式2;正回顾(?<=e):如 (?<=表达式2)表达式1 表达式3
,则表式前面的内容需要匹配表达式2;负回顾(?<!e):如 (?<!表达式2)表达式1 表达式3
,则表式前面的内容不能匹配表达式2。
例如我们想查找一个字串 python
,而这个字串后面必须要跟着 data
字串,那我们就可以使用 (python)\s+(?=data)
。
这样即使字串中有 python
,但我们限定了只匹配这种情况,可以大大提高了准确率。
条件表达
相信大家在平时开发过程中会经常用到三目运算符,比如 data == 1 ? 'Y' : 'N'
,在正则里也有类似的运算操作。
表达式:(?(判断表达式) 为真时执行表达式| 为假时执行表达式),当判断表达式
匹配到内容的时候,则这里就会匹配为真时的表达式,否则就会匹配为假时的表达式。
例如:(?(\d+) [\s\d,]| [\s,])
正则的四大功能
在我们平时用正则表达式处理字符串的时候,主要会使用到它的四大功能:
匹配:这个之前已经详细讲过了,就是看这个字符串是否符合正则表达式的语法。
提取:这个功能就是用来通过正则表达式提取指定字符串中符合要求的文本,如果有符合表达式的内容会返回一个或多个。
替换:这个功能可能用的会少一些,主要是用来将查找到的符合要求的文本,替换成我们指定的字符串。
拆分:这个功能用的更少了,其实就是用正则表达式对符合要求的文本字串进行分割。
正则的其他方法
上次已经说了四个比较常用的方法,主要用来做匹配和提取,另外还有一些方法用来做替换和拆分,在这里我们也说一下:
sub(str, t, n):这个方法用来替换操作。即将每个匹配到的文本用
str
进行替换,并返回替换后的字符串。当指定了n
时,则最多替换 n 次。对于str
可以是组名或者编号来引用捕获到的内容。subn(str, t, n):这个方法和
sub()
方法基本相同,只是这个会返回一个二元组,其中除了包括结果字串,还有替换的数量。split(str, n):这个方法是用来拆分字串操作。即将匹配到的文本对字符串进行分割,并返回一个结果列表。如果正则存在分组,则把分组匹配文本放列表中,并且每两个分割的中间作为列表的一部分。
正则匹配对象
一般正则表达式可以匹配的对象不同,需要调用不同的方法获取。
方法 | 描述说明 |
---|---|
group() | 返回编号或组名匹配到的内容。默认(0)是表示匹配整个表达式内容,当然也可以指定多个,则会返回一个元组数据。 |
groupdict() | 这个方法会返回一个字典,其中字典的 KEY 是命名的组名,VALUE 为组名对应获取的内容。 |
groups() | 该方法会返回一个包含所有捕获内容的子分组的元组,如果指定了默认值,则这个值就会作为没有获取到的内容的值。 |
lastgroup() | 该方法用于获取最后一个匹配到内容的组名。 |
lastindex() | 该方法会返回最后一个匹配到内容的组编号。 |
start() | 该方法用于指定匹配内容子分组是从字串的哪个位置开始匹配的,如果没有匹配则返回 -1。 |
end() | 该方法用于返回当前匹配对象子分组是从哪个位置匹配结束的,如果没有匹配则返回 -1. |
span() | 该方法会返回一个二元组,内容为 (start(), end()) 的返回值。 |
pos() | 该方法用于搜索字符串的开头起始位置。 |
endpos() | 该方法用于搜索字符串的结束末尾位置。 |
常用正则表达式
英文和数字:
^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
中文、英文、数字包括下划线:
^[\u4E00-\u9FA5A-Za-z0-9_]+$
Email地址:
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
手机号码:
^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
身份证号码:
(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)
空白行:
\n\s*\r
日期格式:
^\d{4}-\d{1,2}-\d{1,2}
复杂密码:
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,10}$
域名:
[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?
总结
好了,今天就算是把 Python
正则表达式相关的都介绍完了,为了方便大家理解,讲的比较基础,但真正用在项目中的时候,可以举一反三灵活运用。OK,今天就聊这些,如果你喜欢记得点 在看
。
PS:公号内回复「Python」即可进入Python 新手学习交流群,一起 100 天计划!
老规矩,兄弟们还记得么,右下角的 “在看” 点一下,如果感觉文章内容不错的话,记得分享朋友圈让更多的人知道!
【代码获取方式】