轻松学会Python正则表达式(正则表达 python)
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: abc2.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: 123452.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: 4564. 正则表达式使用技巧
- 使用非贪婪模式(?)来避免匹配过多内容。
例如,<.*?> 匹配 HTML 标签时,只匹配最短的内容,而 "<.*>" 会匹配尽可能长的内容。 - 使用 \b 和 \B 来确保匹配的词在边界上。
- 避免在正则表达式中使用过多的捕获组(()),否则可能会影响效率和可读性。
正则表达式是一个非常有用的工具,用于字符串的搜索和替换。掌握基本的正则表达式符号后,我们就可以更加高效地处理各种字符串匹配任务。