【正则表达式 PYTHON】
一、什么是正则表达式?
正则表达式是一种用于匹配文本模式的工具。它是一个特殊的字符序列,可以帮助你在文本中查找、替换或验证符合特定规则的字符串。例如,你可以使用正则表达式来检查一个字符串是否是一个有效的电子邮件地址、电话号码,或者从一段文本中提取所有的数字。
在 Python 中,通过re
模块来支持正则表达式的操作。
二、re 模块的基本函数
- re.match()
- 功能:尝试从字符串的起始位置匹配一个模式。如果匹配成功,返回一个匹配对象;如果失败,返回
None
。 - 示例:
- 功能:尝试从字符串的起始位置匹配一个模式。如果匹配成功,返回一个匹配对象;如果失败,返回
import re
text = "Hello, world!"
pattern = "Hello"
match_result = re.match(pattern, text)
if match_result:
print("匹配成功")
else:
print("匹配失败")
- 在这个例子中,
re.match()
会尝试从text
字符串的开头匹配pattern
(即 “Hello”),因为文本开头是 “Hello”,所以匹配成功。
- re.search()
- 功能:在整个字符串中搜索第一个匹配给定模式的子串。如果找到,返回一个匹配对象;如果没有找到,返回
None
。 - 示例:
- 功能:在整个字符串中搜索第一个匹配给定模式的子串。如果找到,返回一个匹配对象;如果没有找到,返回
import re
text = "The quick brown fox jumps over the lazy dog"
pattern = "fox"
search_result = re.search(pattern, text)
if search_result:
print("找到匹配的子串")
else:
print("未找到匹配的子串")
- 这里
re.search()
会在整个text
字符串中查找 “fox”,找到后返回匹配对象。
- re.findall()
- 功能:在字符串中找到所有匹配给定模式的子串,并返回一个列表。如果没有匹配的子串,返回一个空列表。
- 示例:
import re
text = "apple,banana,cherry"
pattern = "[a - z]+"
findall_result = re.findall(pattern, text)
print(findall_result)
- 这个正则表达式
[a - z]+
会匹配一个或多个连续的小写字母。re.findall()
会在text
中找到所有符合这个模式的子串,返回一个包含 “apple”、“banana” 和 “cherry” 的列表。
- re.sub()
- 功能:用于在字符串中替换所有匹配给定正则表达式的子串。
- 示例:
import re
text = "I have 3 apples and 2 bananas"
pattern = "[0 - 9]+"
new_text = re.sub(pattern, "some", text)
print(new_text)
- 这里
re.sub()
会将text
中所有匹配[0 - 9]+
(一个或多个数字)的子串替换为 “some”,最后输出的new_text
为 “I have some apples and some bananas”。
三、正则表达式的基本语法
- 字符类
- 方括号
[]
用于定义字符类。例如,[abc]
可以匹配a
、b
或c
中的任意一个字符。 - 范围表示法:
[a - z]
可以匹配从a
到z
的所有小写字母,[0 - 9]
可以匹配所有数字。
- 方括号
- 量词
*
:匹配前面的字符零次或多次。例如,a*
可以匹配空字符串、a
、aa
、aaa
等。+
:匹配前面的字符一次或多次。例如,a+
可以匹配a
、aa
、aaa
等,但不能匹配空字符串。?
:匹配前面的字符零次或一次。例如,a?
可以匹配空字符串或a
。{n}
:匹配前面的字符恰好n
次。例如,a{3}
可以匹配aaa
。{n,}
:匹配前面的字符至少n
次。例如,a{2,}
可以匹配aa
、aaa
、aaaa
等。{n,m}
:匹配前面的字符至少n
次且最多m
次。例如,a{1,3}
可以匹配a
、aa
、aaa
。
- 元字符
.
:匹配除换行符\n
之外的任意一个字符。例如,a.b
可以匹配aab
、a0b
等。^
:在字符类[]
外,用于匹配字符串的开头。例如,^Hello
可以匹配以Hello
开头的字符串。在字符类[]
内,^
表示取反。例如,[^abc]
可以匹配除a
、b
、c
之外的任意字符。$
:用于匹配字符串的结尾。例如,world$
可以匹配以world
结尾的字符串。\
:用于转义字符。例如,\*
匹配*
字符本身,因为*
在正则表达式中有特殊含义。
四、编译正则表达式(可选但高效)
你可以使用re.compile()
函数来编译一个正则表达式模式。这在需要多次使用同一个模式进行匹配等操作时非常有用,因为编译后的模式可以提高匹配效率。
示例:
import re
pattern = re.compile("[a - z]+")
text1 = "apple"
text2 = "123"
match_result1 = pattern.match(text1)
match_result2 = pattern.match(text2)
if match_result1:
print("text1匹配成功")
if match_result2:
print("text2匹配成功")
在这个例子中,先编译了一个匹配一个或多个小写字母的正则表达式模式。然后用这个编译后的模式分别对text1
和text2
进行匹配操作。