Python 正则表达式是用于字符串匹配的强大工具,支持模式匹配、查找、替换等操作。正则表达式通过特定的语法来表示字符串中的模式,帮助我们高效地处理文本。
1. 表示字符
正则表达式中的字符可以表示不同的字符类。常见的字符类有:
.
:匹配除换行符以外的任意字符。\d
:匹配数字(0-9)。\D
:匹配非数字字符。\w
:匹配字母、数字或下划线(等价于[a-zA-Z0-9_]
)。\W
:匹配非字母、数字或下划线。\s
:匹配任意空白字符(空格、制表符、换行符等)。\S
:匹配非空白字符。
示例:匹配数字
import re
pattern = r'\d+' # 匹配一个或多个数字
text = 'I have 123 apples.'
result = re.findall(pattern, text)
print(result) # 输出 ['123']
2. 表示数量
在正则表达式中,可以通过量词来控制匹配的数量:
*
:匹配前面的字符零次或多次(包括零次)。+
:匹配前面的字符一次或多次。?
:匹配前面的字符零次或一次。{n}
:匹配前面的字符恰好 n 次。{n,}
:匹配前面的字符至少 n 次。{n,m}
:匹配前面的字符至少 n 次,至多 m 次。
示例:匹配一个或多个字母
pattern = r'[a-zA-Z]+' # 匹配一个或多个字母
text = 'Hello 123 world'
result = re.findall(pattern, text)
print(result) # 输出 ['Hello', 'world']
3. 原始字符串
在正则表达式中使用反斜杠(\
)时,通常需要转义。例如,\\
用于表示单个反斜杠,而 \d
用于匹配数字。为了避免手动转义,Python 提供了原始字符串(r''
),它会忽略字符串中的反斜杠转义。
示例:原始字符串的使用
pattern = r'\d+\.\d+' # 匹配浮动小数
text = 'The price is 123.45 dollars.'
result = re.findall(pattern, text)
print(result) # 输出 ['123.45']
使用 r''
表示原始字符串,可以避免使用额外的反斜杠进行转义。
4. 表示边界
在正则表达式中,边界表示符用于匹配位置:
^
:匹配字符串的开始位置。$
:匹配字符串的结束位置。\b
:匹配单词边界(例如,空格或标点符号)。\B
:匹配非单词边界。
示例:匹配以数字开头的字符串
pattern = r'^\d+' # 匹配以数字开头的字符串
text = '123abc'
result = re.match(pattern, text)
if result:
print(result.group()) # 输出 '123'
示例:匹配单词边界
pattern = r'\bword\b' # 匹配完整单词 'word'
text = 'wordplay and word'
result = re.findall(pattern, text)
print(result) # 输出 ['word', 'word']
5. 匹配分组
分组可以将正则表达式的一部分括起来,这样可以对其进行单独匹配、提取或引用。
()
:用于创建一个分组。\1
,\2
, …:表示分组的反向引用,即引用第 1、2 等分组匹配的内容。
示例:使用分组提取匹配内容
pattern = r'(\d+)-(\d+)' # 匹配两个数字,中间用'-'分隔
text = '2021-12'
result = re.match(pattern, text)
if result:
print(result.group(1)) # 输出 '2021'
print(result.group(2)) # 输出 '12'
示例:反向引用
pattern = r'(\b\w+\b)\s+\1' # 匹配重复的单词
text = 'hello hello world'
result = re.findall(pattern, text)
print(result) # 输出 ['hello']
总结
- 表示字符:如
\d
(数字)、\w
(字母数字下划线)、\s
(空白字符)等。- 表示数量:量词如
*
(零次或多次)、+
(一次或多次)、{n,m}
(n至m次)等。- 原始字符串:使用
r''
来表示原始字符串,避免反斜杠转义问题。- 表示边界:使用
^
(字符串开始)、$
(字符串结束)、\b
(单词边界)等来定义匹配位置。- 匹配分组:通过括号
()
创建分组,提取匹配的子串,可以使用反向引用。