re.match()和re.search()

match()函数要求必须从字符串开始处开始匹配,而search()函数则可扫描整个字符串,从中间任意位置开始匹配。

  • 代码演示:
import re

m1 = re.match('www', 'www.taobao.com')  # 从开始位置匹配
print(m1.span()) # span返回匹配的位置
print(m1.group()) # group 返回匹配的组
print(re.match('taobao', 'www.taobao.com'))  # 如果从开始位置匹配不到,返回None


m2 = re.search('www', 'www.taobao.com')  # 从开始位置匹配
print(m2.span())
print(m2.group())


m3 = re.search('taobao', 'www.taobao.com')  # 从中间位置匹配,返回Match对象
print(m3.span())
print(m3.group())
  • 输出结果:
(0, 3)
www
None
(0, 3)
www
(4, 10)
taobao

re.findall() 和re.finditer()

re.findall(pattern, string, flags=0): 扫描整个字符串, 并返回字符串中所有匹配pattern的子串组成的列表。其中pattern参数代表正则表达式,string代表被匹配的字符串, flags代表正则表达式的匹配旗标。
re.finditer(pattern, string, flags=0): 扫描整个字符串, 并返回字符串中所有匹配pattern的子串组成的迭代器。其中pattern参数代表正则表达式,string代表被匹配的字符串, flags代表正则表达式的匹配旗标。

  • 代码演示
import re
# 返回所有匹配pattern的子串组成的列表,忽略大小写
print(re.findall('taobao', 'taobao is very cheap, taobao.com is my favorite', re.I))

# 返回所有匹配pattern的子串组成的迭代器,忽略大小写
it = re.finditer('taobao', 'taobao is very cheap, taobao.com is my favorite', re.I)
for e in it:
    print(str(e.span()) + "-->" + e.group())
  • 输出结果
['taobao', 'taobao']
(0, 6)-->taobao
(22, 28)-->taobao

re.fullmatch()和re.sub()

re.fullmatch(pattern, string, flags=0): 该函数要求整个字符串能匹配pattern,如果匹配则返回包含匹配信息的_sre.SRE_Match对象,否则返回None。
re.sub(pattern, repl, string, count=0, flags=0): 该函数用于将string字符串中所有匹配pattern的内容替换成repl,repl既可是被替换的字符串,也可以是一个函数。count参数控制最多替换多少次,如果指定count为0,则表示全部替换。

  • 代码演示
import re
my_date = '2020-10-30'
# 将my_date字符串里的中划线替换成斜线
print(re.sub(r'-', '/', my_date))

# 将my_date字符串里的中划线替换成斜线,只替换一次
print(re.sub(r'-', '/', my_date, 1))
  • 输出结果
2020/10/30
2020/10-30

注意:上面程序所使用的 r’-’ 是原始字符串,其中r代表原始字符串,从而避免对字符串中的特殊字符进行转义。

re.split(pattern, string, maxsplit=0, flags=0)

re.split(pattern, string, maxsplit=0, flags=0): 使用pattern对string进行分割,该函数返回分割得到的多个子串组成的列表,其中maxsplit参数控制最多分割几次。

  • 代码演示:
import re
# 使用逗号对字符串进行分割
print(re.split(', ', 'taobao, amazon, jd'))

# 指定只分割一次,被切分成两个子串
print(re.split(', ', 'taobao, amazon, jd', 1))

# 使用a进行分割
print(re.split('a', 'taobao, amazon, jd'))

# 使用x进行分割,没有匹配内容,则不会执行分割
print(re.split('x', 'taobao, amazon, jd'))
  • 输出结果
['taobao', 'amazon', 'jd']
['taobao', 'amazon, jd']
['t', 'ob', 'o, ', 'm', 'zon, jd']
['taobao, amazon, jd']

re.compile()

使用complie()函数编译正则表达式后,该函数所返回的对象就会缓存该正则表达式,从而可以多次利用该正则表达式执行匹配。

  • 代码演示
import re
# 编译得到正则表达式对象
pa = re.compile('taobao')
# 调用match方法,原本应该从开始位置匹配,此处指定从索引4的地方开始匹配,可以匹配成功
print(pa.match('www.taobao,com', 4).span())

# 此处指定从索引4到索引10之间执行全匹配,匹配成功
print(pa.fullmatch('www.taobao,com', 4, 10).span())

# 此处指定从索引4到索引6之间执行匹配,匹配失败
print(pa.match('www.taobao,com', 4, 6).span())
  • 输出结果
(4, 10)
(4, 10)
Traceback (most recent call last):
  File "/Users/gcui/PycharmProjects/blog/re.test.py", line 19, in <module>
    print(pa.match('www.taobao,com', 4, 6).span())
AttributeError: 'NoneType' object has no attribute 'span'

在正则表达式中使用组

  • 代码演示
import re
# 在正则表达式中使用组
m = re.search(r'(taobao).(com)', r'www.taobao.com is a good domain')
print(m.group(0))

# 调用的简化写法
print('----调用的简化写法1----')
print(m[0])
print(m.span(0))
print(m.group(1))

# 调用的简化写法2
print('----调用的简化写法2----')
print(m[1])
print(m[2])
print(m.span(1))
print(m.group(2))

# 返回所有组所匹配的字符串组成的元组
print('----返回所有组所匹配的字符串组成的元组----')
print(m.groups())
  • 输出结果
taobao.com
----调用的简化写法1----
taobao.com
(4, 14)
taobao
----调用的简化写法2----
taobao
com
(4, 10)
com
----返回所有组所匹配的字符串组成的元组----
('taobao', 'com')

上面程序中search()函数使用了一个正则表达式:r’(taobao).(com)’, 在该正则表达式内包含两个组,即(fkit)和(org),因此程序可以依次获取group(0)、group(1)、group(2)的值,也就是依次获取整个正则表达式所匹配的子串、第一个组所匹配的子串和第二个组所匹配的子串。