【Python基础】第18节:正则表达式

  1. 正则表达式

正则表达式用于查找符合规则的字符串。正则表达式具备通用性,所以是用处最广泛的字符串匹配语法,无论是Python、Java、PHP,还是数据库语言SQL,它的语法规则是基本通用的。

比如:

'哈哈哈哈哈哈我爱你' → 匹配 '我爱你'

Python中如何使用正则表达式

  1. 导入模块
  1. import re # Python标准库
  1. 使用方法进行匹配

例如:match()方法

  1. result = re.match('正则表达式', '目标字符串')
  1. 获得匹配结果
  1. print(result.group()) # 获取匹配结果

基本使用示例:

  1. 1.导入模块

  2. import re
  3. 2.使用方法进行匹配操作,例如match(从开始位置往后查找匹配)

  4. result = re.match(r'.*我爱你', '哈哈哈哈哈哈我爱你')
  5. '''其中��
  6. r'.*我爱你':是正则表达式
  7. '哈哈哈哈哈哈我爱你':是要匹配的字符串
  8. '''
  9. 3、拿到匹配的结果数据,可以通过group方法获取

  10. print(result.group())
  1. 匹配规则

匹配单个字符

表格:

|------------|----------------------|
| 符号 | 功能 |
| . | 匹配任意字符(除\n) |
| [] | 匹配括号内任意字符(比如[abc]) |
| \d | 匹配数字(0-9) |
| \D | 匹配非数字 |
| \s | 匹配空白(空格、\t、\n) |
| \S | 匹配非空白 |
| \w | 匹配单词字符(a-zA-Z0-9_汉字) |
| \W | 匹配非单词字符 |

  1. .匹配任意字符(除换行符 \n**)**
  1. import re
  2. 示例1:匹配任意字符(字母)

  3. ret = re.match(".", "A")
  4. print(ret.group()) # 输出: A
  5. 示例2:匹配任意字符(数字)

  6. ret = re.match(".", "7")
  7. print(ret.group()) # 输出: 7
  8. 示例3:匹配任意字符(符号)

  9. ret = re.match(".", "$")
  10. print(ret.group()) # 输出: $
  11. 示例4:无法匹配换行符

  12. ret = re.match(".", "\n") # 匹配失败
  13. print(ret) # 输出: None

2. [] :匹配括号内任意一个字符

  1. import re
  2. 示例1:匹配指定字符 [abc]

  3. ret = re.match("[abc]", "b") # 匹配成功
  4. print(ret.group()) # 输出: b
  5. 示例2:匹配范围字符 [0-9]

  6. ret = re.match("[0-9]", "5") # 匹配数字
  7. print(ret.group()) # 输出: 5
  8. 示例3:匹配混合范围 [a-zA-Z]

  9. ret = re.match("[a-zA-Z]", "Z") # 匹配大写字母
  10. print(ret.group()) # 输出: Z
  11. 示例4:匹配失败

  12. ret = re.match("[abc]", "d") # 匹配失败
  13. print(ret) # 输出: None

3. \d :匹配数字(0-9)

  1. import re
  2. 示例1:匹配数字

  3. ret = re.match("\d", "9") # 匹配成功
  4. print(ret.group()) # 输出: 9
  5. 示例2:匹配失败(非数字)

  6. ret = re.match("\d", "a") # 匹配失败
  7. print(ret) # 输出: None

4. \D :匹配非数字

  1. 示例1:匹配字母

  2. ret = re.match("\D", "A") # 匹配成功
  3. print(ret.group()) # 输出: A
  4. 示例2:匹配符号

  5. ret = re.match("\D", "$") # 匹配成功
  6. print(ret.group()) # 输出: $
  7. 示例3:匹配失败(数字)

  8. ret = re.match("\D", "5") # 匹配失败
  9. print(ret) # 输出: None

5. \s :匹配空白字符(空格、 \t \n

  1. import re
  2. 示例1:匹配空格

  3. ret = re.match("\s", " ") # 匹配成功
  4. print(repr(ret.group())) # 输出: ' '
  5. 示例2:匹配制表符 `\t`

  6. ret = re.match("\s", "\t") # 匹配成功
  7. print(repr(ret.group())) # 输出: '\t'
  8. 示例3:匹配换行符 `\n`

  9. ret = re.match("\s", "\n") # 匹配成功
  10. print(repr(ret.group())) # 输出: '\n'
  11. 示例4:匹配失败(非空白)

  12. ret = re.match("\s", "a") # 匹配失败
  13. print(ret) # 输出: None

6. \S :匹配非空白字符

  1. import re
  2. 示例1:匹配字母

  3. ret = re.match("\S", "A") # 匹配成功
  4. print(ret.group()) # 输出: A
  5. 示例2:匹配数字

  6. ret = re.match("\S", "5") # 匹配成功
  7. print(ret.group()) # 输出: 5
  8. 示例3:匹配失败(空白符)

  9. ret = re.match("\S", "\t") # 匹配失败
  10. print(ret) # 输出: None

7. \w :匹配单词字符(字母、数字、下划线、汉字)

  1. import re
  2. '''7. \w:匹配单词字符(字母、数字、下划线、汉字)'''
  3. 示例1:匹配字母

  4. ret = re.match("\w", "a") # 匹配成功
  5. print(ret.group()) # 输出: a
  6. 示例2:匹配数字

  7. ret = re.match("\w", "7") # 匹配成功
  8. print(ret.group()) # 输出: 7
  9. 示例3:匹配下划线

  10. ret = re.match("\w", "_") # 匹配成功
  11. print(ret.group()) # 输出: _
  12. 示例4:匹配汉字

  13. ret = re.match("\w", "周") # 匹配成功
  14. print(ret.group()) # 输出: 周

8. \W :匹配非单词字符(符号、空格等)

  1. import re
  2. 示例1:匹配符号

  3. ret = re.match("\W", "$") # 匹配成功
  4. print(ret.group()) # 输出: $
  5. 示例2:匹配空格

  6. ret = re.match("\W", " ") # 匹配成功
  7. print(repr(ret.group())) # 输出: ' '
  8. 示例3:匹配失败(单词字符)

  9. ret = re.match("\W", "a") # 匹配失败
  10. print(ret) # 输出: None

匹配多个字符

|------------|--------------------|
| 符号 | 功能 |
| * | 匹配前一个字符0次或多次(贪婪模式) |
| + | 匹配前一个字符1次或多次 |
| ? | 匹配前一个字符0次或1次 |
| {m} | 精确匹配m次 |
| {m,n} | 匹配m到n次 |

1. *:匹配前一个字符 0次或多次(贪婪模式)

  1. import re
  2. 示例1:匹配小写字母0次或多次(允许大写后无小写)

  3. ret = re.match("[A-Z][a-z]*", "M") # 匹配成功(0次小写)
  4. print(ret.group()) # 输出: M
  5. 示例2:匹配多个小写字母

  6. ret = re.match("[A-Z][a-z]*", "MdueD6Ddas") # 匹配到第一个非小写字母前
  7. print(ret.group()) # 输出: Mdue
  8. 示例3:匹配数字0次或多次

  9. ret = re.match("\d*", "abc") # 匹配空字符串(0次数字)
  10. print(ret.group()) # 输出: (空字符串,无报错)

2. +:匹配前一个字符 1次或多次(至少一次)

  1. 示例1:匹配小写字母至少一次

  2. ret = re.match("[A-Z][a-z]+", "Hello") # 匹配成功
  3. print(ret.group()) # 输出: Hello
  4. 示例2:匹配失败(小写字母不足一次)

  5. ret = re.match("[A-Z][a-z]+", "H") # 匹配失败
  6. print(ret) # 输出: None
  7. 示例3:匹配连续数字

  8. ret = re.match("\d+", "138abc") # 匹配到第一个非数字前
  9. print(ret.group()) # 输出: 138

3. ?:匹配前一个字符 0次或1次(可选匹配)

  1. 示例1:匹配可选字符(http或https)

  2. ret = re.match("https?", "http") # 匹配成功(0次s)
  3. print(ret.group()) # 输出: http
  4. ret = re.match("https?", "https") # 匹配成功(1次s)
  5. print(ret.group()) # 输出: https
  6. 示例2:匹配可选数字

  7. ret = re.match("周周\d?", "周周") # 匹配成功(0次数字)
  8. print(ret.group()) # 输出: 周周
  9. ret = re.match("周周\d?", "周周5") # 匹配成功(1次数字)
  10. print(ret.group()) # 输出: 周周5

4. {m}:精确匹配前一个字符 m次

  1. 示例1:精确匹配11位手机号

  2. ret = re.match("\d{11}", "13847758302") # 匹配成功
  3. print(ret.group()) # 输出: 13847758302
  4. 示例2:匹配失败(不足m次)

  5. ret = re.match("\d{3}", "12") # 匹配失败
  6. print(ret) # 输出: None

5. {m,n}:匹配前一个字符 m到n次(贪婪模式)

  1. 示例1:匹配6~10位数字

  2. ret = re.match("\d{6,10}", "1384775830245678") # 匹配前10位
  3. print(ret.group()) # 输出: 1384775830
  4. 示例2:匹配失败(不足m次)

  5. ret = re.match("\d{6,10}", "13567") # 匹配失败(仅5位)
  6. print(ret) # 输出: None

匹配开头结尾

|------------|------------|
| 符号 | 功能 |
| ^ | 匹配字符串开头 |
| $ | 匹配字符串结尾 |

  1. ^:匹配字符串开头

强制匹配从字符串的第一个字符开始

  1. import re
  2. 示例:匹配以大写字母开头的字符串

  3. text = "Hello"
  4. pattern = "^[A-Z]" # 从开头匹配大写字母
  5. ret = re.match(pattern, text)
  6. print(ret.group()) # 输出: H
  7. 匹配失败示例

  8. text = "hello"
  9. ret = re.match(pattern, text)
  10. print(ret) # 输出: None

2. $ :匹配字符串结尾

\d$ 匹配结尾数字:

  1. 示例:匹配以数字结尾的字符串

  2. text = "user123"
  3. pattern = ".*\d$" # 开头任意内容 + 结尾数字
  4. ret = re.match(pattern, text)
  5. print(ret.group()) # 输出: user123
  6. 匹配失败示例

  7. text = "user123a"
  8. ret = re.match(pattern, text)
  9. print(ret) # 输出: None

3. ^ $ 联合使用:精确匹配整个字符串

确保字符串完全符合 指定模式。

  1. 示例1:校验手机号(必须为11位纯数字)

  2. ret = re.match("^\d{11}$", "13847758302") # 匹配成功
  3. print(ret.group()) # 输出: 13847758302
  4. 示例2:校验邮箱格式(简单示例)

  5. email_regex = "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"
  6. ret = re.match(email_regex, "user@example.com") # 匹配成功
  7. print(ret.group()) # 输出: user@example.com
  8. 示例3:匹配失败(字符串包含多余字符)

  9. ret = re.match("^abc$", "abc123") # 结尾不是abc
  10. print(ret) # 输出: None

4. 转义字符:匹配字面意义的 ^ $

使用 \ 转义符号本身。(这里用的方法是search(),后面有对该方法的使用详解。)

  1. 示例1:匹配以 $ 开头的字符串

  2. ret = re.search("^\", "100") # 匹配成功
  3. print(ret.group()) # 输出: $
  4. 示例2:匹配包含 ^ 的字符串

  5. ret = re.search("\^", "a^b") # 匹配成功
  6. print(ret.group()) # 输出: ^

匹配分组

|--------------|--------------------|
| 符号 | 功能 |
| | | 匹配左右任意一个表达式 |
| (ab) | 将括号中字符作为一个分组 |
| \num | 引用分组num匹配到的字符串 |
| (?P<name>) | 分组起别名 |
| (?P=name) | 引用别名为name分组匹配到的字符串 |

1. | :匹配左右任意一个表达式

用于逻辑"或"操作,通常在分组内定义多个候选模式。

  1. import re
  2. 示例:匹配纯小写、纯大写或纯数字的字符串(完全匹配)

  3. lyst = ['abc', 'ABC', '123', 'abc123', 'ABC123', '哈哈哈哈哈哈']
  4. for text in lyst:
  5. 正则说明:匹配纯小写 | 纯大写 | 纯数字(必须从开头到结尾)

  6. pattern = r"^([a-z]+|[A-Z]+|\d+)$"
  7. match = re.match(pattern, text)
  8. if match:
  9. print(f"'{text}' 匹配成功 → 分组内容: {match.group(1)}")
  10. else:
  11. print(f"'{text}' 匹配失败")
  12. 输出:

  13. 'abc' 匹配成功 → 分组内容: abc

  14. 'ABC' 匹配成功 → 分组内容: ABC

  15. '123' 匹配成功 → 分组内容: 123

  16. 'abc123' 匹配失败

  17. 'ABC123' 匹配失败

  18. '哈哈哈哈哈哈' 匹配失败

2. (ab) \num

(ab)创建捕获分组。将括号内内容作为一个分组,后续可通过索引提取。

\num:引用分组。通过 \1 \2 等格式引用前面分组的匹配结果(索引从 1 开始)。

  1. 示例:匹配重复的分组内容(如 "abcabc")

  2. text = "abcabc"
  3. pattern = r"^([a-z]{3})\1$" # \1 引用第一个分组(匹配 "abc" 重复一次)
  4. match = re.match(pattern, text)
  5. print(match.group()) # 输出: abcabc
  6. 示例:匹配重复的标签结构(如 "<html>content</html>")

  7. text = "<html>content</html>"
  8. pattern = r"^<(\w+)>.*</\1>$" # \1 引用分组1(标签名)
  9. match = re.match(pattern, text)
  10. print(match.group()) # 输出: <html>content</html>

3. (?P<name>) (?P=name)

(?P<name>)命名分组。为分组指定别名,通过名称提取内容(提高可读性)。

(?P=name):引用命名分组。通过别名引用之前的分组匹配结果。

  1. 示例1:匹配 HTML 标签结构(确保标签名一致)

  2. text = "<html><h1>www.baidu.com</h1></html>"
  3. pattern = r"^<(?P<tag_html>html)><(?P<tag_h1>h1)>.*</(?P=tag_h1)></(?P=tag_html)>$"
  4. match = re.match(pattern, text)
  5. if match:
  6. print("匹配成功:", match.group())
  7. print("HTML标签名:", match.group("tag_html")) # 输出: html
  8. print("H1标签名:", match.group("tag_h1")) # 输出: h1
  9. else:
  10. print("匹配失败")
  11. 示例2:匹配重复的字母+数字组合(如 "abc123abc123")

  12. text = "abcdef0123456789abcdef0123456789"
  13. pattern = r"^(?P<letters>[a-z]+)(?P<numbers>\d+)(?P=letters)(?P=numbers)$"
  14. match = re.match(pattern, text)
  15. if match:
  16. print("匹配成功:", match.group())
  17. print("字母部分:", match.group("letters")) # 输出: abcdef
  18. print("数字部分:", match.group("numbers")) # 输出: 0123456789
  19. else:
  20. print("匹配失败")
  1. re模块的其它匹配用法。

上面的正则匹配规则中,多数用到的都是match方法,其实re模块中还要很多其它的方法。下面举几个常用的用法一一讲解。

1. re.match(pattern, string)

  1. 功能 :从字符串开头 匹配正则表达式,若开头不匹配则返回 None。
  2. 参数说明
    • pattern:正则表达式(字符串或预编译对象)。
    • string:要匹配的目标字符串。
  3. 返回值 :Match 对象(匹配成功)或 None。
  4. 示例
  1. import re
  2. 示例:匹配以大写字母开头的单词

  3. text = "Hello World"
  4. match = re.match(r"^[A-Z]\w+", text)
  5. if match:
  6. print(match.group())
  7. else:
  8. print('不匹配')

2. re.search(pattern, string)

  1. 功能 :扫描整个字符串,返回第一个 匹配项。
  2. 参数说明
    • pattern:正则表达式。
    • string:目标字符串。
  3. 返回值 :Match 对象或 None。
  4. 示例
  1. 示例:查找字符串中的第一个数字

  2. match_obj = re.search("\d+", "周周已经30岁了,蓓蓓才10岁")
  3. if match_obj:
  4. 获取匹配结果数据

  5. print(match_obj.group())
  6. else:
  7. print("匹配失败")

3. re.findall(pattern, string)

  1. 功能 :返回所有非重叠匹配项 的列表。
  2. 参数说明
    • pattern:正则表达式。
    • string:目标字符串。
  3. 返回值
    • 无分组时:字符串列表(如 ['a', 'b'])。
    • 有分组时:元组列表(如 [('2023', '10'), ('2024', '01')])。
  4. 示例
  1. match_obj = re.findall("\d+", "周周已经30岁了,蓓蓓才10岁")
  2. if match_obj:
  3. 获取匹配结果数据

  4. print(match_obj)
  5. else:
  6. print("匹配失败")

分组对匹配结果的影响:

  1. ------------ 示例1:无分组时匹配所有字母和数字组合 ------------

  2. a = "abc123_abc456"
  3. b = re.findall(r"[a-z]+\d*", a)
  4. print(b) # 输出: ['abc123', 'abc456']
  5. ------------ 示例2:分组时仅提取分组内容 ------------

  6. a = "abc123_abc456_789"
  7. b = re.findall(r"[a-z]+(\d*)", a) # 强调只提取括号内的 \d*
  8. print(b) # 输出: ['123', '456', ''](注意最后一个匹配的 \d* 为空)
  9. ------------ 示例3:多分组时提取元组列表 ------------

  10. a = "abc123abc456哈哈哈哈哈哈abc789abc901"
  11. b = re.findall(r"[a-z]+(\d*)[a-z]+(\d*)", a)
  12. print(b) # 输出: [('123', '456'), ('789', '901')]

4. re.sub(pattern, repl, string, count=0)

  1. 功能 :替换所有匹配项(或前 count 个)。
  2. 参数说明
    • pattern:正则表达式。
    • repl:替换内容(字符串或函数)。
    • string:目标字符串。
    • count:最大替换次数(默认 0 表示全部替换)。
  3. 返回值 :替换后的新字符串。
  4. 示例
  1. match_obj = re.sub("\d+", '18', "周周已经30岁了,蓓蓓才10岁", count=0)
  2. if match_obj:
  3. 获取匹配结果数据

  4. print(match_obj)
  5. else:
  6. print("匹配失败")

5. re.split(pattern, string, maxsplit=0)

  1. 功能 :按正则表达式分割字符串。
  2. 参数说明
    • pattern:正则表达式。
    • string:目标字符串。
    • maxsplit:最大分割次数(默认 0 表示全部分割)。
  3. 返回值 :分割后的字符串列表。
  4. 示例
  1. ------------ 示例1:使用正则表达式分割复杂分隔符 ------------

  2. text = '香蕉,苹果、菠萝,栗子。猕猴桃'
  3. pattern = r'[,,、。]' # 匹配逗号、中文逗号、顿号、句号
  4. result = re.split(pattern, text)
  5. print(result) # 输出: ['香蕉', '苹果', '菠萝', '栗子', '猕猴桃']
  6. ------------ 示例2:限制分割次数 ------------

  7. text = '香蕉、苹果、菠萝,栗子。猕猴桃'
  8. result = re.split(r'[,,、。]', text, maxsplit=2)
  9. print(result) # 输出: ['香蕉', '苹果', '菠萝,栗子。猕猴桃']

高级技巧【拓展】

  1. flags参数:

正则表达式的 flags 参数用于控制匹配模式,所有方法均支持此参数(如 re.match(), re.search(), re.findall(), re.sub(), re.split() 等)。以下是常用修饰符:

|---------------|------------|-------------------|----------------------|
| 修饰符 | 简写 | 作用 | 示例场景 |
| re.IGNORECASE | re.I | 忽略大小写 | 匹配 "Hello" 和 "hello" |
| re.MULTILINE | re.M | 多行模式(^ 和 $ 匹配每行) | 处理多行日志 |
| re.DOTALL | re.S | . 匹配包括换行符的所有字符 | 提取跨行文本 |
| re.ASCII | - | 仅匹配 ASCII 字符 | 过滤非英文字符 |

使用示例:

  1. 示例1:忽略大小写匹配(re.IGNORECASE)

  2. text = "Apple Banana"
  3. matches = re.findall(r"apple", text, flags=re.IGNORECASE)
  4. print(matches) # 输出: ['Apple']
  5. 示例2:多行模式(re.MULTILINE)

  6. text = "Line1\nLine2"
  7. matches = re.findall(r"^Line\d", text, flags=re.MULTILINE)
  8. print(matches) # 输出: ['Line1', 'Line2']
  9. 示例3:组合多个修饰符(re.I | re.S)

  10. text = "Start\nEnd"
  11. match = re.search(r"start.*end", text, flags=re.I | re.S)
  12. print(match.group()) # 输出: Start\nEnd

2. 预编译正则表达式

什么是预编译正则表达式?
  1. 定义 :通过 re.compile() 将正则表达式字符串转换为 Pattern 对象,后续可直接调用该对象的方法(如 match(), search())。
  2. 核心作用提升性能 (避免重复解析正则表达式),并简化代码复用。
基本使用方法示例:

步骤

    1. 使用 re.compile() 编译正则表达式,生成 Pattern 对象。
    2. 调用 pattern 对象的方法(如 match(), search()),参数与原 re 模块方法一致。
  1. 示例:在循环中重复匹配

  2. import re
  3. 1.预编译正则表达式

  4. pattern = re.compile(r"\d+")
  5. data_list = ["user123", "item456", "price789"] # 需要匹配的字符串
  6. for text in data_list:
  7. 2.调用预编译对象pattern的方法

  8. match = pattern.search(text)
  9. print(match.group()) # 输出: 123, 456, 789
多方法复用示例:

就是同一正则表达式需用于 match、search、findall 等多种操作时。

  1. pattern = re.compile(r"\b\w+\b") # 预编译
  2. text = "hello world"
  3. 复用同一个 Pattern 对象

  4. print(pattern.match(text).group()) # 输出: hello
  5. print(pattern.findall(text)) # 输出: ['hello', 'world']
  1. 贪婪和非贪婪匹配

1. 贪婪匹配

  1. 定义 :默认模式,匹配时尽可能多地 吞并字符,直到无法满足后续条件为止。
  2. 语法 :使用 *, +, ?, {n,m} 等量词时,默认是贪婪的。
  3. 示例
  1. import re
  2. s = "A phone number 130-9411-2846"
  3. r = re.match(r"(.+)(\d+-\d+-\d+)", s)
  4. print(r.group(1)) # 输出: A phone number 13
  5. print(r.group(2)) # 输出: 0-9411-2846(不符合预期!)
    • 问题原因 :.+ 贪婪吞并尽可能多字符,直到最后一个 \d 才停止。

2. 非贪婪匹配

  1. 定义 :匹配时尽可能少地 吞并字符,一旦满足条件立即结束。
  2. 语法 :在量词后添加 ?,如 *?, +?, ??。
  3. 示例
  1. s = "A phone number 130-9411-2846"
  2. r = re.match(r"(.+?)(\d+-\d+-\d+)", s)
  3. print(r.group(1)) # 输出: A phone number
  4. print(r.group(2)) # 输出: 130-9411-2846(正确分割!)
    • 解决原因 :.+? 非贪婪匹配到第一个 \d 前即停止。

3. 对比总结

|------------|------------|------------|--------------|
| 类型 | 语法 | 行为 | 适用场景 |
| 贪婪匹配 | .+ | 尽可能多匹配字符 | 需要吞并大部分内容时 |
| 非贪婪匹配 | .+? | 尽可能少匹配字符 | 需要精准分割前后内容时 |

  1. 原生字符串 r 的作用

之前的正则中,需要用反斜杠 \ 对一些特殊字符进行转译,但是如果我们就是需要去匹配反斜杠呢?此时可以用到r写在正则的匹配规则之前,做到将正则的规则字符串看作原生的字符,即为不需要再去转译的字符。

  1. 反斜杠 \ 的转义冲突

正则表达式中需用 \d、\w 等语法,而 Python 字符串本身用 \ 表示转义,导致需写多个 \。

  1. 示例
  1. 目标:匹配字符串 "d:\a\b\c"

  2. m = "d:\\a\\b\\c" # Python 字符串需转义为 "d:\\a\\b\\c"
  3. 未用原生字符串写法

  4. ret = re.match("d:\\\\a", m) # 需写4个反斜杠!
  5. print(ret.group()) # 输出: d:\a(实际匹配到 "d:\\a")
  6. 使用原生字符串写法

  7. ret = re.match(r"d:\\a", m) # 只需写2个反斜杠
  8. print(ret.group()) # 输出: d:\a(匹配到 "d:\\a")

2. 原生字符串 r 的作用

  1. 功能 :取消 Python 字符串的转义,使 \ 直接表示字面意义。
  2. 语法 :在字符串前加 r,如 r"\d+"。
  3. 对比示例
  1. print("\\") # 输出: \
  2. print(r"\\") # 输出: \\
  1. 示例:非贪婪匹配 + 原生字符串

  2. text = "Price: 100.99, Tax: 20.5"
  3. pattern = re.compile(r"\$(.+?)\b") # 匹配金额(非贪婪)
  4. matches = pattern.findall(text)
  5. print(matches) # 输出: ['100.99', '20.5']