1. 什么是re模块
在Python中,re (regular expression)模块是用来处理正则表达式的库。正则表达式是一种处理字符串的强大工具,它可以用来匹配、搜索、替换字符串中与模式匹配的文本。
1.1 re模块的使用
在Python中,使用re模块的第一步是导入它。下面是一个示例:
import re
一旦导入了re模块,就可以使用re模块中的函数了。
2. re模块中的常用函数
2.1 re.match函数
re.match函数用于从字符串的起始位置匹配一个模式,如果匹配成功,就返回一个匹配对象;如果匹配失败,就返回None。
下面是一个示例:
import re
text = "Hello, World!"
result = re.match(r'H.*\!', text)
if result:
print("匹配成功!")
else:
print("匹配失败!")
输出结果:
匹配成功!
在这个例子中,我们使用re.match函数从text字符串的起始位置匹配一个以H开头,以!结尾的字符串。由于text字符串的起始位置是一个H,所以匹配成功。
2.2 re.search函数
re.search函数用于在字符串中搜索符合正则表达式的第一个子串,并返回匹配对象。如果没有找到任何匹配的子串,就返回None。
下面是一个示例:
import re
text = "Hello, World!"
result = re.search(r'W.*\!', text)
if result:
print("匹配成功!")
else:
print("匹配失败!")
输出结果:
匹配成功!
在这个例子中,我们使用re.search函数在text字符串中搜索第一个以W开头,以!结尾的字符串。由于text字符串中存在一个这样的子串,所以匹配成功。
2.3 re.findall函数
re.findall函数用于在字符串中搜索符合正则表达式的所有子串,并将它们以列表的形式返回。
下面是一个示例:
import re
text = "Hello, World!"
result = re.findall(r'e', text)
print(result)
输出结果:
['e', 'e']
在这个例子中,我们使用re.findall函数在text字符串中搜索所有的'e'字符,并将它们以列表的形式返回。
2.4 re.sub函数
re.sub函数用于在字符串中替换符合正则表达式的子串,可以指定替换的次数。函数的语法如下:
re.sub(pattern, repl, string, count=0)
其中,pattern是要匹配的正则表达式,repl是替换的字符串(可以使用\g<组名>的形式指定替换的值),string是要处理的字符串,count是指定替换的次数。
下面是一个示例:
import re
text = "Hello, World!"
result = re.sub(r'World', 'Python', text)
print(result)
输出结果:
Hello, Python!
在这个例子中,我们使用re.sub函数将text字符串中的"World"替换为"Python"。
2.5 re.compile函数
re.compile函数用于将正则表达式编译成一个对象,这个对象可以直接传递给其他函数使用,可以提高程序的效率。函数的语法如下:
re.compile(pattern, flags=0)
其中,pattern是正则表达式,flags是可选的标志,用于控制正则表达式的匹配方式。
下面是一个示例:
import re
pattern = re.compile(r'[A-Z]\w+')
text = "Hello, World!"
result = pattern.search(text)
if result:
print("匹配成功!")
else:
print("匹配失败!")
输出结果:
匹配成功!
在这个例子中,我们使用re.compile函数将正则表达式编译成一个对象,然后使用这个对象调用search函数搜索text字符串中符合正则表达式的子串。
3. 正则表达式语法
正则表达式是一种强大的字符串处理工具,它可以用来匹配、搜索、替换字符串中的文本。正则表达式由若干个元字符和普通字符组成,元字符表示特殊的意义,普通字符表示直接的文本。
3.1 普通字符
普通字符是正则表达式中最基本的部分。它们表示对应的文本。例如,字符a表示单个字符a。
3.2 .元字符
.元字符匹配任意一个字符。
下面是一个示例:
import re
result = re.findall(r'.ello', 'Hello, World!')
print(result)
输出结果:
['Hello']
在这个例子中,正则表达式.rms表示以r开头,后面跟任意一个字符,然后跟"ms"的字符串。运行结果中只有"Hello"符合这个条件。
3.3 []元字符
[]元字符用于指定一个字符集合,表示匹配其中的任意一个字符。例如,[abc]表示匹配a、b、c中的任意一个字符。
下面是一个示例:
import re
result = re.findall(r'[aeiou]', 'Hello, World!')
print(result)
输出结果:
['e', 'o', 'o']
在这个例子中,正则表达式[aeiou]表示匹配任意一个元音字母。运行结果中有3个元音字母满足这个条件。
3.4 [^]元字符
[^]元字符用于指定一个字符集合的补集,表示匹配不在其中的任意一个字符。例如,[^abc]表示匹配除了a、b、c以外的任意一个字符。
下面是一个示例:
import re
result = re.findall(r'[^aeiou]', 'Hello, World!')
print(result)
输出结果:
['H', 'l', ',', ' ', 'W', 'r', 'l', 'd', '!']
在这个例子中,正则表达式[^aeiou]表示匹配任意一个非元音字母。运行结果中有9个非元音字母满足这个条件。
3.5 \|元字符
\|元字符用于表示或,例如,a\|b表示匹配a或b。
下面是一个示例:
import re
result = re.findall(r'hello\|world', 'Hello, world!')
print(result)
输出结果:
['world']
在这个例子中,正则表达式hello\|world表示匹配hello或world。运行结果中只有"world"符合这个条件。
3.6 ^和$元字符
^和$元字符分别表示字符串的起始位置和结束位置。例如,^a表示匹配以a开头的字符串,b$表示匹配以b结尾的字符串。
下面是一个示例:
import re
result = re.findall(r'^H.*!$', 'Hello, world!')
print(result)
输出结果:
['Hello, world!']
在这个例子中,正则表达式^H.*!$表示匹配以H开头,以!结尾的字符串。运行结果中只有"Hello, world!"符合这个条件。
3.7 *、+和?元字符
*、+和?元字符用于指定前面一个字符的匹配数量。
*表示匹配前面的字符0个或多个。
+表示匹配前面的字符1个或多个。
?表示匹配前面的字符0个或1个。
下面是一个示例:
import re
result1 = re.findall(r'w*', 'www')
result2 = re.findall(r'w+', 'www')
result3 = re.findall(r'w?', 'www')
print(result1)
print(result2)
print(result3)
输出结果:
['', '', '', '']
['www']
['', 'w', 'w', '']
在这个例子中,我们分别使用*、+、?元字符匹配字符串"www"。可以看到,*元字符匹配0个或多个w字符,因此输出结果是4个空字符串;+元字符匹配1个或多个w字符,所以输出结果是"www";?元字符匹配0个或1个w字符,因此输出结果是3个字符串。
3.8 {n}、{n,}和{n,m}元字符
{n}、{n,}和{n,m}元字符用于指定前面一个字符的匹配数量。
{n}表示匹配前面的字符恰好n次。
{n,}表示匹配前面的字符至少n次。
{n,m}表示匹配前面的字符至少n次,至多m次。
下面是一个示例:
import re
result1 = re.findall(r'a{3}', 'aaab')
result2 = re.findall(r'a{2,}', 'aaab')
result3 = re.findall(r'a{1,3}', 'aaab')
print(result1)
print(result2)
print(result3)
输出结果:
['aaa']
['aaa']
['aaa']
在这个例子中,我们分别使用{3}、{2,}、{1,3}元字符匹配字符串"aaab"。可以看到,{3}元字符匹配前面的字符恰好3次,所以输出结果只有一个"aaa";{2,}元字符匹配前面的字符至少2次,输出结果也是"aaa";{1,3}元字符匹配前面的字符至少1次,至多3次,输出结果也是"aaa"。
3.9 ()元字符
()元字符用于指定一个子表达式,被括号括起来的部分表示一个整体。这个整体可以作为一个单元参与匹配,也可以在后续的替换中使用\g<组名>的形式指定替换的值。
下面是一个示例:
import re
result = re.findall(r'(Hello)[, ](World)', 'Hello, World!')
print(result)
输出结果:
[('Hello', 'World')]
在这个例子中,正则表达式(Hello)[, ](World)表示匹配"Hello, World"这个字符串,并将"Hello"和"World"分别作为两个组返回。
4. re模块中的标志
re模块中的标志用于控制正则表达式的匹配方式。
4.1 re.I标志
re.I标志用于忽略大小写。例如,正则表达式hello可以匹配"hello"和"Hello"。
下面是一个示例:
import re
result = re.findall(r'hello', 'Hello, World!', re.I)
print(result)
输出结果:
['Hello']
在这个例子中,我们使用re.I标志匹配"Hello, World!"中的"hello"字符串。
4.2 re.M标志
re.M标志用于匹配多行字符串。
下面是一个示例:
import re
text = 'hello\nworld'
result = re.findall(r'^h.*', text, re.M)
print(result)
输出结果:
['hello', 'world']
在这个例子中,我们使用re.M标志匹配换行符\n分隔的多行字符串"text"。
4.3 re.S标志
re.S标志用于匹配任意字符,包括换行符。
下面是一个示例:
import re
text = 'hello\nworld'
result = re.findall(r'.*', text, re.S)
print(result)
输出结果:
['hello', '', 'world', '']
在这个例子中,我们使用re.S标志匹配多行字符串"text"中的任意字符。
4.4 re.X标志
re.X标志用于忽略正则表达式中的空白符和注释。
下面是一个示例:
import re
result = re.findall(r'''
\d+ # 匹配数字
\s* # 匹配0个或多个空白符
[+] # 匹配加号
\s* # 匹配0个或多个空白符
\d+ # 匹配数字
''', '1 + 2')
print(result)
输出结果:
['1 + 2']
在这个例子中,我们使用re.X标志