《Python基础》之正则表达式--re模块
目录
简介
正则表达式语法介绍
1. 基本字符匹配
2. 字符集
3. 预定义字符集
4. 重复匹配
5. 边界匹配
6. 分组与捕获
7. 反向引用
8. 特殊字符转义
9. 常用正则表达式示例
re模块的用法
1、re.findall()
2、re.match()
3、re.search()
4、re.split()
5、re.finditer()
6、re.fullmatch()
7、re.sub()
总结
简介
正则表达式(Regular Expressions,简称 regex 或 regexp)是一种用于匹配字符串中字符组合的模式。正则表达式的语法非常强大,可以用于复杂的字符串匹配和操作。
Python 正则表达式(Regular Expressions)是通过 re
模块来实现的。正则表达式是一种强大的工具,用于在字符串中查找、匹配和替换特定的模式。re
模块提供了许多函数来处理正则表达式。
正则表达式语法介绍
1. 基本字符匹配
-
普通字符:直接匹配字符本身。例如,
a
匹配字符a
。 -
.
:匹配任意单个字符(除了换行符\n
)。
2. 字符集
-
[abc]
:匹配字符集中的任意一个字符。例如,[abc]
可以匹配a
、b
或c
。 -
[^abc]
:匹配不在字符集中的任意一个字符。例如,[^abc]
可以匹配除了a
、b
、c
之外的任意字符。 -
[a-z]
:匹配从a
到z
的任意一个字符。 -
[A-Z]
:匹配从A
到Z
的任意一个字符。 -
[0-9]
:匹配从0
到9
的任意一个字符。
3. 预定义字符集
-
\d
:匹配任意数字字符,等价于[0-9]
。 -
\D
:匹配任意非数字字符,等价于[^0-9]
。 -
\w
:匹配任意字母、数字或下划线字符,等价于[a-zA-Z0-9_]
。 -
\W
:匹配任意非字母、数字或下划线字符,等价于[^a-zA-Z0-9_]
。 -
\s
:匹配任意空白字符(包括空格、制表符、换行符等)。 -
\S
:匹配任意非空白字符。
4. 重复匹配
-
*
:匹配前面的字符零次或多次。例如,a*
可以匹配""
、"a"
、"aa"
等。 -
+
:匹配前面的字符一次或多次。例如,a+
可以匹配"a"
、"aa"
、"aaa"
等。 -
?
:匹配前面的字符零次或一次。例如,a?
可以匹配""
或"a"
。 -
{n}
:匹配前面的字符恰好n
次。例如,a{3}
可以匹配"aaa"
。 -
{n,}
:匹配前面的字符至少n
次。例如,a{2,}
可以匹配"aa"
、"aaa"
、"aaaa"
等。 -
{n,m}
:匹配前面的字符至少n
次,至多m
次。例如,a{2,4}
可以匹配"aa"
、"aaa"
、"aaaa"
。
5. 边界匹配
-
^
:匹配字符串的开头。例如,^abc
匹配以abc
开头的字符串。 -
$
:匹配字符串的结尾。例如,abc$
匹配以abc
结尾的字符串。 -
\b
:匹配单词边界。例如,\bword\b
匹配独立的单词word
。 -
\B
:匹配非单词边界。例如,\Bword\B
匹配不在单词边界的word
。
6. 分组与捕获
-
()
:用于分组和捕获子表达式。例如,(abc)+
可以匹配"abc"
、"abcabc"
等。 -
(?:...)
:非捕获分组,只分组不捕获。例如,(?:abc)+
可以匹配"abc"
、"abcabc"
等,但不捕获分组内容。
7. 反向引用
-
\1
、\2
等:引用前面捕获的分组。例如,(\d+)-\1
可以匹配"123-123"
。
8. 特殊字符转义
-
\
:用于转义特殊字符。例如,\.
匹配字符.
。
9. 常用正则表达式示例
-
匹配邮箱地址:
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
-
匹配URL:
https?://(?:www\.)?[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(?:/[^\s]*)?
-
匹配日期(YYYY-MM-DD):
\d{4}-\d{2}-\d{2}
-
匹配IP地址:
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
re模块的用法
1、re.findall()
在大字符串中查找符合正则表达式特点的式子
findall = re.findall(r'\d+', 'abc123def456ghi')
print(findall) # 输出: ['123', '456']
2、re.match()
匹配整个字符串是否符合某个正则表达式特点
match = re.match(r'\d+', '123abc')
if match:
print("匹配成功:", match.group()) # 输出: 匹配成功: 123
else:
print("匹配失败")
3、re.search()
从左向右匹配正则表达式,只会匹配一次符合条件, 得到的是一个对象
search = re.search(r'\d+', 'abc123def')
if search:
print("匹配成功:", search.group()) # 输出: 匹配成功: 123
else:
print("匹配失败")
4、re.split()
根据选项将字符串分割
split = re.split(r'\d+', 'abc123def456ghi')
print(split) # 输出: ['abc', 'def', 'ghi']
5、re.finditer()
返回一个迭代器,每个元素是一个匹配对象,包含字符串中所有非重叠的匹配结果
finditer = re.finditer(r'\d+', 'abc123def456ghi')
for match in finditer:
print("匹配成功:", match.group())
# 输出:
# 匹配成功: 123
# 匹配成功: 456
6、re.fullmatch()
将字符串整体与正则表达式进行匹配
text = '安徽省-合肥市-蜀山区-浮山路'
res1 = re.fullmatch(f'(\w+)-(\w+)-(\w+)-(\w+)', text)
print(f"省份:{res1.group(1)}")
print(f"市:{res1.group(2)}")
print(f"区:{res1.group(3)}")
print(f"街道:{res1.group(4)}")
# 输出:
# 省份:安徽省
# 市:合肥市
# 区:蜀山区
# 街道:浮山路
7、re.sub()
替换字符串中所有匹配的模式
sub = re.sub(r'\d+', 'X', 'abc123def456ghi')
print(sub) # 输出: abcXdefXghi
总结
re
模块是 Python 中处理正则表达式的核心工具。通过 re
模块,你可以轻松地进行字符串的模式匹配、查找、替换和分割等操作。掌握正则表达式的基本语法和 re
模块的常用函数,将极大地提高你处理字符串的能力。