0%

regular-basic

表达式字符

元字符

正则表达式中常用的元字符包括. * + ? \ [ ] ^ $ { } | ( )等。

字符 含义 说明
. 表示除换行符之外的任意单个字符
* 表示匹配前面的子表达式任意次,包括0次
+ 表示匹配前面的子表达式一次或多次,不包括0次
? 表示匹配前面的子表达式0次或1次
\ 表示将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。
^ 表示匹配文本的开头位置
$ 表示匹配文本的结尾位置
| 表示指明两项之间的一个选择
[] 表示一个中括号表达式的开始
{} 表示一个限定符表达式的开始
() 表示一个子表达式的开始和结束位置

定位符

定位符用来描述字符串或单词的边界,^$ 分别指字符串的开始与结束,\b 描述单词的前或后边界,\B 表示非单词边界。

字符 含义 说明
^ 表示匹配文本的开头位置
$ 表示匹配文本的结尾位置
\b 表示匹配一个单词边界,即字与空格间的位置 单词边界限定符使用示例
\B 表示匹配非单词边界 非单词边界限定符使用示例

限定符

限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配,有 *** 或 **+?{n}{n,}{n,m} 共6种。

字符 含义 说明
* 表示匹配前面的子表达式任意次,包括0次
+ 表示匹配前面的子表达式一次或多次,不包括0次
? 表示匹配前面的子表达式0次或1次
{n} 表示匹配前面的子表达式确定的n次,n是一个非负整数
{n,} 表示匹配前面的子表达式至少n次,n是一个非负整数
{n,m} 表示匹配前面的子表达式至少n次至多m次,n和吗是一个非负整数

转义字符

字符 含义 说明
\w 匹配字母、数字、下划线 等价于[a-zA-Z0-9_]
\W 匹配非文字字符 等价于[^a-zA-Z0-9_]
\d 匹配数字字符 等价于[0-9]
\D 匹配任意一个不是0-9之间数字字符的字符 等价于[^0-9
\s 匹配任意一个空白字符,包括空格、tab、换行符等 等价于表达式 [\t\n\r\f\v]
\S 匹配任意一个非空白字符 等价于表达式 [^ \t\n\r\f\v]

常用方法

re.find()方法

find()方法用于遍历整个字符串,返回一个包含所有要求的字符串list

1
2
3
4
5
import re

content = "Hello world! Python is good program language. Cpython is compiler for it."
result = re.findall(r"python", content)
print(result)

执行结果

1
['python']

re.match()方法

re.sub()方法

基本语法如下:re.sub(pattern, repl, string, count=0, flags=0)

其中,pattern是正则表达式,用于匹配要替换的部分;repl是替换的字符串;string是要进行替换操作的原始字符串;count是替换的次数,默认为0,表示替换所有匹配的部分;flags是匹配模式,可以指定多个标志组合使用。

1
2
3
4
5
6
7
8
9
10
11
import re

content = "张三:13155591234"
# 用法1
result = re.sub(r"(\d{3})\d{4}(\d{4})", "\g<1>****\g<2>", content)
print(result)

# 用法2
pattern = re.compile(r"(\d{3})\d{4}(\d{4})")
result = pattern.sub("\g<1>****\g<2>", content)
print(result)

执行结果

1
张三:131****1234

特别地,\g<n>表示带分组的替换,可用于保留原有字符串的分组内容!!!

括号-分组

1
2
3
4
5
6
7
8
9
import re

content = '''张三,手机号码13155591234
李四,手机号码15895887689
王五,手机号码19955994561'''

pattern = re.compile(r"^(.+),.+(\d{11})", re.MULTILINE)
result = pattern.findall(content)
print(result)

执行结果

1
[('张三', '13155591234'), ('李四', '15895887689'), ('王五', '19955994561')]

当有多个分组的时候,可以使用(?P<分组名>...)这样的格式,对每个分组进行命令,示例如下

1
2
3
4
5
6
7
8
9
10
11
import re

content = '''张三,手机号码13155591234
李四,手机号码15895887689
王五,手机号码19955994561'''

pattern = re.compile(r"^(?P<name>.+),.+(?P<phone_num>\d{11})", re.MULTILINE)

for match in pattern.finditer(content):
print(match.group("name"))
print(match.group("phone_num"))

执行结果

1
2
3
4
5
6
张三
13155591234
李四
15895887689
王五
19955994561