Python re
模块支持的正则表达式
Python 的 re
模块使用与 PCRE(Perl Compatible Regular Expressions)兼容的正则表达式。以下是一些常用的正则表达式语法和概念。
常用正则表达式语法
1. 匹配单个字符
-
.
:匹配除换行符外的任意单个字符。 -
\w
:匹配字母、数字及下划线,等同于[a-zA-Z0-9_]
。 -
\W
:匹配非字母、数字及下划线,等同于[^a-zA-Z0-9_]
。 -
\d
:匹配任意数字,等同于[0-9]
。 -
\D
:匹配任意非数字字符,等同于[^0-9]
。 -
\s
:匹配任意空白字符(空格、制表符等),等同于[ \t\n\r\f\v]
。 -
\S
:匹配任意非空白字符,等同于[^ \t\n\r\f\v]
。
2. 边界匹配
-
^
:匹配字符串的开头。 -
$
:匹配字符串的结尾。 -
\b
:匹配单词边界。 -
\B
:匹配非单词边界。
3. 重复匹配
-
*
:匹配前面的字符 0 次或多次(如a*
匹配 0 个或多个a
)。 -
+
:匹配前面的字符 1 次或多次(如a+
匹配 1 个或多个a
)。 -
?
:匹配前面的字符 0 次或 1 次(如a?
匹配 0 个或 1 个a
)。 -
{m,n}
:匹配前面的字符至少m
次,至多n
次(如a{2,4}
匹配 2 到 4 个a
)。
4. 分组与捕获
-
()
:分组并捕获子表达式(如(abc)
匹配 “abc” 并捕获)。 -
(?:)
:分组但不捕获(如(?:abc)
匹配 “abc” 但不捕获)。 -
(?P<name>...)
:命名捕获组。 -
\n
:引用第n
个捕获的子表达式(如(abc)\1
匹配 “abcabc”)。
5. 字符集
-
[abc]
:匹配a
、b
或c
中的任意一个字符。 -
[^abc]
:匹配除a
、b
、c
以外的任意字符。 -
[a-z]
:匹配小写字母a
到z
之间的任意字符。 -
[0-9]
:匹配数字0
到9
。
6. 特殊语法
-
|
:表示或(如a|b
匹配a
或b
)。 -
(?=...)
:正向先行断言,匹配…前的位置(如a(?=b)
匹配 “a”,但 “a” 后面必须是 “b”)。 -
(?!...)
:负向先行断言,匹配非…前的位置(如a(?!b)
匹配 “a”,但 “a” 后面不能是 “b”)。
正则表达式的种类
-
POSIX 正则表达式:
- 包括基本正则表达式(BRE)和扩展正则表达式(ERE)。广泛应用于 Unix 和 Linux 系统的工具中。
-
Perl 兼容正则表达式(PCRE):
- 现代编程语言中常见的正则表达式标准,功能强大,支持复杂模式匹配和高级特性。
-
.NET 正则表达式:
- 基于 PCRE,但有一些独特的扩展,如右到左的匹配模式和命名组引用等。
-
Java 正则表达式:
- 与 PCRE 非常相似,也支持命名捕获组和断言等功能。
Python 的 re
模块采用 PCRE 语法,支持丰富的匹配和断言模式。
示例代码
import re
# 要匹配的字符串
text = "2.49 2.16 1.95 6/189 517739"
# 使用命名捕获组来匹配小数数字
pattern = r"(?P<num1>\d+\.\d+)\s+(?P<num2>\d+\.\d+)\s+(?P<num3>\d+\.\d+)"
# 执行匹配
match = re.search(pattern, text)
if match:
# 提取并输出匹配结果
num1 = match.group('num1')
num2 = match.group('num2')
num3 = match.group('num3')
print(f"num1: {num1}, num2: {num2}, num3: {num3}, num1 + num2 : {float(num1) + float(num2)}")
else:
print("匹配失败")