什么是正则表达式?可以这么说,正则表达式是一套匹配字符串的规则。
正则表达式能做什么?
正则规则:所有的规则中的字符可以匹配到字符串中的内容
字符组匹配
正则表达式 | 匹配规则 | 示例 |
---|---|---|
[abc] | 中括号表示匹配中括号内任意一个字符 | [abc]匹配a或者b或者c |
[0-9] | 可以使用 - 来根据ASCII码匹配内容 | [0-9]匹配0-9中任一数字;[a-zA-Z]匹配大小写字母 |
[0-9][0-9] | 可以使用多个来匹配多个字符 | [0-9][0-9]匹配任意两位数的数字 |
特殊字符匹配
特殊字符 | 含义 |
---|---|
\d | 匹配任何十进制数字;相当于类[0-9] |
\D | 与\d相反,匹配任何非十进制数字的字符;相当于类[ ^0-9] |
\s | 匹配任何空白字符(包含空格、换行符、制表符等);相当于类[\t\n\r\f\v] |
\S | 与\s相反,匹配任何非空白字符;相当于类 [ ^ \t\n\r\f\v] |
\w | 匹配任何单词字符,相当于字符类 [a-zA-Z0-9_] |
\W | 与 \w 相反 |
\b | 匹配单词的开始或结束 |
\B | 与 \b 相反 |
^ | 匹配字符串头部(如^a匹配abc,不匹配bbac) |
$ | 匹配字符串尾部 |
. | 匹配除换行符以外的字符 |
表达式1|表达式2 | 匹配|两边的任一表达式,优先匹配左边(例:ab|abc在匹配abc时匹配结果是ab) |
\+特殊转移字符 | 取消特殊转移字符的特殊作用(如\.表示匹配. 而不是匹配除换行符以外的字符) |
() | 分组,约束|描述的内容的范围 |
在正则表达式中能够帮助我们表示匹配的内容的符号都是正则中的元字符
量词
量词 | 含义 |
---|---|
{n} | 匹配n次 |
{n,} | 至少匹配n次 |
{n,m} | 至少匹配n次,至多匹配m次 |
? | 匹配0次或1次 |
+ | 匹配1次或多次 |
* | 匹配0次或多次 |
贪婪匹配
贪婪匹配机制:在量词允许的范围内,尽可能多的匹配内容。
相应的有一种非贪婪的匹配机制,称为惰性匹配,其在量词允许的范围内尽可能少的匹配内容。(在python中,在具有贪婪匹配机制的量词后面加一个?表示其为惰性匹配)
转义符
原本有特殊意义的字符,一旦需要表达它本身意义的时候,需要使用\
转义;有一些有特殊意义的内容放在字符组中会取消它的特殊意义,如[().*+?]
等会匹配其本身(不具有特殊意义)。
了解更多正则表达式的使用方法,可以参考这篇博客的内容: https://blog.csdn.net/qq_41556318/article/details/84974867
re模块提供了python中操作正则表达式的方法。
findall方法
# findall方法:匹配给定形式的所有内容,以列表返回
import re
ret = re.findall(‘\d‘,‘sauf674567a7sdftada3s4‘)
print(ret) # [‘6‘, ‘7‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘7‘, ‘3‘, ‘4‘]
ret1 = re.findall(‘\d+‘,‘sauf674567a7sdftada3s4‘)
print(ret1) # [‘674567‘, ‘7‘, ‘3‘, ‘4‘]
search方法
# search方法:匹配给定形式的第一个内容
import re
ret = re.search(‘\d+‘,‘sauf674567a7sdftada3s4‘)
print(ret) # <re.Match object; span=(4, 10), match=‘674567‘>
print(ret.group()) # 674567
# 观察一种情况
ret1 = re.search(‘9\d+‘,‘sauf674567a7sdftada3s4‘)
print(ret1) # None
print(ret1.group())
# AttributeError: ‘NoneType‘ object has no attribute ‘group‘
# 上述情况可以如下处理
ret1 = re.search(‘9\d+‘,‘sauf674567a7sdftada3s4‘)
print(ret1) # None
if ret1:# 当ret1为None时,条件不成立,不会执行if后的语句
print(ret1.group())
当上述两种方法中匹配字符里面具有分组时(即匹配字符里面带有括号时):
import re
ret1 = re.findall(‘1(\d)\d‘,‘1234179‘)
print(ret1) # [‘2‘, ‘7‘]
# findall按照完整的正则进行匹配,但是只显示括号里匹配到的内容
ret2 = re.search(‘1(\d)(\d)‘,‘1234179‘)
print(ret2) # <re.Match object; span=(0, 3), match=‘123‘>
if ret2:
print(ret2.group()) # 123
print(ret2.group(0)) # 123 # group()和group(0)的结果一致
print(ret2.group(1)) # 2 # 第一个(\d)匹配到的内容
print(ret2.group(2)) # 3 # 第二个(\d)匹配到的内容
# search按照完整的正则进行匹配,并显示匹配到的第一个内容
# 但是可以通过给group方法传参数来获取具体分组的内容
原文:https://www.cnblogs.com/20-03-14/p/12593531.html