杰瑞科技汇

Python正则如何匹配任意字符?

在 Python 的正则表达式中,"任意字符" 的表示方法取决于你想要匹配的具体范围,最常用的是 (点号),但它有一些特殊的行为,下面我将详细解释各种情况。

Python正则如何匹配任意字符?-图1
(图片来源网络,侵删)

最常用的: (点号)

是最接近“任意字符”概念的正则表达式元字符,它会匹配除换行符 \n 之外的任何单个字符。

示例代码

import re
text = "Hello World! 123\nThis is a test."
pattern = r"H.llo" # 匹配 'H' 后跟任意一个字符,再跟 'llo'
match = re.search(pattern, text)
if match:
    print(f"找到匹配: {match.group()}") # 输出: Hello
else:
    print("未找到匹配")
# --- 另一个例子 ---
pattern2 = r"d! .1" # 匹配 'd' 后跟 '!',再跟任意一个字符,再跟 '1'
match2 = re.search(pattern2, text)
if match2:
    print(f"找到匹配: {match2.group()}") # 输出: d! 1
else:
    print("未找到匹配")
# --- 注意:. 不匹配换行符 ---
pattern3 = r "World! .T" # 期望匹配 "World! " 后跟任意字符,再跟 "T"
# 由于换行符 \n 在中间,这个会失败
match3 = re.search(pattern3, text)
if match3:
    print(f"找到匹配: {match3.group()}")
else:
    print("未找到匹配") # 输出: 未找到匹配

匹配“真正”的任意字符(包括换行符)

如果你想要匹配任何字符,包括换行符 \n,你需要使用特殊标志 re.DOTALL (或 re.S)。

re.DOTALL 标志被设置时,点号 的行为会改变,它可以匹配包括换行符在内的所有字符。

示例代码

import re
text = "Hello World! 123\nThis is a test."
pattern = r "World! .This" # 期望匹配 "World! " 后跟任意字符,再跟 "This"
# 不使用 re.DOTALL 标志
match_without_flag = re.search(pattern, text)
if match_without_flag:
    print(f"不使用 DOTALL 标志,找到匹配: {match_without_flag.group()}")
else:
    print("不使用 DOTALL 标志,未找到匹配") # 输出: 未找到匹配
# 使用 re.DOTALL 标志
match_with_flag = re.search(pattern, text, re.DOTALL)
if match_with_flag:
    print(f"使用 DOTALL 标志,找到匹配: {match_with_flag.group()}") # 输出: World! 123\nThis
else:
    print("使用 DOTALL 标志,未找到匹配")

匹配更广泛的“任意字符”(Unicode 模式)

在 Python 3 中,默认情况下(re.UNICODE 标志,这是默认行为), 也可以匹配 Unicode 字符,如表情符号 或中文 ,这比许多其他编程语言的默认行为更强大。

Python正则如何匹配任意字符?-图2
(图片来源网络,侵删)

如果你明确需要匹配任何 Unicode 字符(但仍不包括换行符,除非你同时使用 re.DOTALL),你可以使用 re.UNICODE 标志(虽然它已经是默认行为,但明确写出有助于代码清晰)。

示例代码

import re
text = "你好,世界!😊"
# 默认情况下,. 可以匹配 Unicode 字符
pattern = r "世界!." # 匹配 "世界!" 后跟任意一个字符
match = re.search(pattern, text)
if match:
    print(f"找到匹配: {match.group()}") # 输出: 世界!😊
else:
    print("未找到匹配")

其他表示“任意字符”的方式

虽然 是最常用的,但在某些特定场景下,你可能需要其他方法。

a) \w (单词字符)

\w 匹配任何单词字符,这包括:

  • 所有大小写字母 [a-zA-Z]
  • 数字 [0-9]
  • 下划线 _
  • 在 Unicode 模式下,还包括所有语言的字母和数字(如 , , )。

用途:非常适合匹配变量名、单词等。

Python正则如何匹配任意字符?-图3
(图片来源网络,侵删)
import re
text = "user_id = 123_abc"
pattern = r "\w+" # 匹配一个或多个单词字符
matches = re.findall(pattern, text)
print(f"找到所有单词字符序列: {matches}") # 输出: ['user_id', '123_abc']

b) \s (空白字符)

\s 匹配任何空白字符,包括:

  • 空格 ` `
  • 制表符 \t
  • 换行符 \n
  • 回车符 \r
  • 换页符 \f

用途:用于匹配空格、缩进等。

import re
text = "Python\tis\nfun"
pattern = r "\s" # 匹配任意一个空白字符
matches = re.findall(pattern, text)
print(f"找到所有空白字符: {matches}") # 输出: ['\t', '\n']

c) \d (数字字符)

\d 匹配任何数字字符,等同于 [0-9]。 在 Unicode 模式下,它也能匹配其他语言的数字字符(如阿拉伯数字 )。

用途:专门用于匹配数字。

import re
text = "价格: 99元, 优惠价: ٨٨元"
pattern = r "\d+" # 匹配一个或多个数字字符
matches = re.findall(pattern, text)
print(f"找到所有数字序列: {matches}") # 输出: ['99', '88']

总结与对比

模式 名称 备注
点号 除换行符外的任何单个字符 最常用,需结合 re.DOTALL 才能匹配换行符。
点号星号 贪婪模式:匹配任意数量的任意字符(直到行尾)。 常用于 这样的模式中。
点号问号星号 非贪婪模式:匹配最少数量的任意字符。 强烈推荐在 后加上 以避免性能问题。
\w 单词字符 [a-zA-Z0-9_] 以及所有语言的字母和数字。 适合匹配变量、单词。
\s 空白字符 空格、制表符 \t、换行符 \n 等。 适合匹配空格和缩进。
\d 数字字符 [0-9] 以及其他语言的数字。 适合匹配数字。

最佳实践建议

  1. 优先使用 :当你想表示“除换行符外的任意字符”时, 是你的首选。
  2. 处理多行文本时,别忘了 re.DOTALL:如果你的字符串中包含换行符,并且你需要跨越换行符进行匹配,请务必在 re.search()re.findall() 等函数中传入 flags=re.DOTALL
  3. *使用非贪婪模式 `.?**:在需要匹配任意字符直到某个特定结束符的场景下(从
    ),始终使用.?而不是.`,这样可以避免匹配过多内容,提高效率和准确性。
# 正确示例:匹配 <p>...</p> 之间的内容
html = "<div><p>这是第一段。</p><p>这是第二段。</p></div>"
pattern = r"<p>(.*?)</p>" # 使用非贪婪模式
matches = re.findall(pattern, html)
print(matches) # 输出: ['这是第一段。', '这是第二段。']
分享:
扫描分享到社交APP
上一篇
下一篇