轻松学会Python正则表达式(正则表达 python)

deer332025-02-01技术文章64

Python的正则表达式(regex)是非常强大的文本处理工具,可以用来匹配、查找和操作字符串。使用re模块来处理正则表达式。下面是关于正则表达式的一些基础概念和示例,帮助你轻松学会。

1. 正则表达式基本语法

1.1元字符

元字符(metacharacters)是正则表达式中具有特殊意义的字符。

  • . : 匹配任意字符(除了换行符)。
    例如,a.c 可以匹配 abc、axc 等。
  • ^ : 匹配字符串的开始位置。
    例如,^abc 可以匹配以 abc 开头的字符串。
  • $ : 匹配字符串的结束位置。
    例如,abc$ 可以匹配以 abc 结尾的字符串。
  • * : 匹配前一个字符零次或多次。
    例如,a* 可以匹配空字符串、a、aa 等。
  • + : 匹配前一个字符一次或多次。
    例如,a+ 可以匹配 a、aa、aaa 等,但不能匹配空字符串。
  • ? : 匹配前一个字符零次或一次。
    例如,a? 可以匹配空字符串或 a。
  • {m,n} : 匹配前一个字符至少 m 次,但最多 n 次。
    例如,a{2,4} 可以匹配 aa、aaa 或 aaaa,但不能匹配 a 或 a 以上次数。

1.2字符集和字符类

  • [] : 匹配括号内的任意字符。例如,[abc] 可以匹配 a、b 或 c。
    • [a-z] 匹配所有小写字母。
    • [A-Z] 匹配所有大写字母。
    • [0-9] 匹配所有数字。
    • [^abc] 匹配不是 a、b 或 c 的字符。
  • | : 或操作符,匹配左边或右边的表达式。例如,a|b 匹配 a 或 b。
  • () : 用于分组,可以提取匹配的子字符串。
    例如,(abc)+ 会匹配一个或多个 abc,并且可以通过捕获组提取匹配的子字符串。

1.3特殊字符和转义

  • \ : 转义字符,用来匹配一些具有特殊含义的字符,或者表示字符类。
    例如,\. 匹配字面上的点(.),\d 匹配数字(等同于 [0-9])。
  • \d : 匹配任何数字,等价于 [0-9]。
    例如,\d{3} 可以匹配三位数字。
  • \D : 匹配任何非数字字符,等价于 [^0-9]。
  • \w : 匹配任何字母、数字或下划线,等价于 [a-zA-Z0-9_]。
    例如,\w+ 可以匹配一个或多个字母、数字或下划线。
  • \W : 匹配任何非字母、数字或下划线,等价于 [^a-zA-Z0-9_]。
  • \s : 匹配任何空白字符,包括空格、制表符、换行符等。
    例如,\s+ 可以匹配一个或多个空白字符。
  • \S : 匹配任何非空白字符。

1.4边界匹配

  • \b : 匹配单词边界,即单词和非单词字符之间的位置。
    例如,\bword\b 匹配单独的 "word",但不匹配 "sword" 或 "word123"。
  • \B : 匹配非单词边界。

2. re模块的常用方法

2.1re.match()

re.match() 从字符串的开始位置尝试匹配正则表达式。

import re

pattern = r"^abc"
text = "abcdef"
result = re.match(pattern, text)
if result:
    print("Match found:", result.group())
else:
    print("No match")

输出结果为:

Match found: abc

2.2re.search()

re.search() 在整个字符串中查找匹配的第一次出现。

pattern = r"\d+"  # 匹配一个或多个数字
text = "The number is 12345."
result = re.search(pattern, text)
if result:
    print("Search result:", result.group())
else:
    print("No match")

输出结果为:

Search result: 12345

2.3re.findall()

re.findall() 返回所有匹配的非重复字符串,以列表形式返回。

pattern = r"\d+"  # 匹配所有数字
text = "123 abc 456 def 789"
result = re.findall(pattern, text)
print("Findall result:", result)

输出结果为:

Findall result: ['123', '456', '789']

2.4re.sub()

re.sub() 用指定的替换字符替换所有匹配的部分。

pattern = r"\d+"  # 匹配所有数字
text = "There are 123 apples and 456 bananas."
result = re.sub(pattern, "X", text)
print("Substituted result:", result)

输出结果为:

Substituted result: There are X apples and X bananas.

2.5re.split()

re.split() 按照匹配的模式将字符串分割成列表。

pattern = r"\s+"  # 匹配一个或多个空格
text = "Hello   world   python"
result = re.split(pattern, text)
print("Split result:", result)

输出结果为:

Split result: ['Hello', 'world', 'python']

3. 捕获组和非捕获组

  • 捕获组用圆括号 () 来表示,并且会将匹配的内容存储在组内。可以通过 group() 方法来访问这些内容。
pattern = r"(\d+)-(\d+)"
text = "123-456"
result = re.search(pattern, text)
if result:
    print("First number:", result.group(1))  # 第一个捕获组
    print("Second number:", result.group(2))  # 第二个捕获组

输出结果为:

First number: 123
Second number: 456
  • 非捕获组用 (?:...) 表示,匹配但不捕获子表达式。
pattern = r"(?:\d+)-(\d+)"
text = "123-456"
result = re.search(pattern, text)
if result:
    print("Second number:", result.group(1))  # 只返回捕获的第二组

输出结果为:

Second number: 456

4. 正则表达式使用技巧

  • 使用非贪婪模式(?)来避免匹配过多内容。
    例如,<.*?> 匹配 HTML 标签时,只匹配最短的内容,而 "<.*>" 会匹配尽可能长的内容。
  • 使用 \b 和 \B 来确保匹配的词在边界上。
  • 避免在正则表达式中使用过多的捕获组(()),否则可能会影响效率和可读性。

正则表达式是一个非常有用的工具,用于字符串的搜索和替换。掌握基本的正则表达式符号后,我们就可以更加高效地处理各种字符串匹配任务。