Python正则表达式详解 - re.match() - re.search() - re.compile() - re.findall() - re.split()

文章目录

  • re.match()
  • re.search()
  • re.compile()
  • re.findall()
  • re.split()

正则表达式(Regular Expression,常简写为 regex、regexp 或 RE)是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。一般只要知道 Python 中常用的正则表达式处理函数就够了。

re.match()

re.match() 按照模式从字符串的起始位置匹配,起始位置匹配成功,则返回一个匹配的对象,否则就返回 None。

函数语法:
re.match(pattern, string, flags=0)

  • pattern:匹配的正则表达式
  • string:被匹配的字符串
  • flags:可选标志修饰符(用来控制正则表达式匹配的模式)

flags可选标志(如下表,多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M)

修饰符 描述
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B
e.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解

正则表达式(如下表,不用刻意去记,用的时候来查就好了)
Python正则表达式详解 - re.match() - re.search() - re.compile() - re.findall() - re.split()_第1张图片Python正则表达式详解 - re.match() - re.search() - re.compile() - re.findall() - re.split()_第2张图片
有了上面表格的参照,再来看例子:

import re

print(re.match('www', 'www.runoob.com'))  # 在起始位置匹配, 返回对象
print(re.match('com', 'www.runoob.com'))  # 不在起始位置匹配, 返回None

输出:


None
import re

line = "Cats are smarter than dogs"
#  .* 表示任意匹配除换行符(\n、\r)之外的任何单个或多个字符
#  .*? 表示匹配.* 定义的0个或者1个片断
#  re.M | re.I 表示多行匹配 或 使匹配对大小写不敏感
matchObj = re.match(r'(.*) are (.*?) .*', line, re.M | re.I)
print(matchObj)

if matchObj:  # 条件语句:如果匹配到了的话,则执行
    """ group([group1, …]) 方法用于获得一个或多个分组(一对小括号代表一个分组)匹配的字符串,
        当要获得整个匹配的子串时,可直接使用 group() 或 group(0) """
    print(matchObj.group())  # 获得整个匹配的子串
    print(matchObj.group(1))  # 获得第一组匹配的子串
    print(matchObj.group(2))  # 获得第二组匹配的子串
    print(matchObj.group(1, 2))  # 获得第一组和第二组匹配的子串, 以元组的形式返回
else:
    print("No match!!")

if matchObj:
    """ start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),
        start() 或 start(0)表示整个字符串的第一个字符的索引 """
    print(matchObj.start())  # 获得整个字符串的第一个字符的索引
    print(matchObj.start(1))  # 获得第一组匹配的子串在整个字符串中的索引(即Cats的C字符的索引)
    print(matchObj.start(2))  # 获得第一组匹配的子串在整个字符串中的索引(即smarter的s字符的索引)
else:
    print("No match!!")

if matchObj:
    """ end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),,
        end() 或 end(0)表示整个字符串的最后一个字符的索引+1 """
    print(matchObj.end())  # 获得整个字符串的最后一个字符的索引+1
    print(matchObj.end(1))  # 获得第一组匹配的子串在整个字符串中的索引+1(即Cats的s字符的索引+1)
    print(matchObj.end(2))  # 获得第一组匹配的子串在整个字符串中的索引+1(即smarter的r字符的索引+1)
else:
    print("No match!!")

if matchObj:
    """ span([group]) 方法返回 (start(group), end(group)) """
    print(matchObj.span())
    print(matchObj.span(1))
    print(matchObj.span(2))
else:
    print("No match!!")

输出:


Cats are smarter than dogs
Cats
smarter
('Cats', 'smarter')
0
0
9
26
4
16
(0, 26)
(0, 4)
(9, 16)

re.search()

re.search() 扫描整个字符串并返回第一个成功的匹配,匹配成功则返回一个匹配的对象,否则返回 None

函数语法:
re.search(pattern, string, flags=0)

  • pattern:匹配的正则表达式
  • string:被匹配的字符串
  • flags:可选标志修饰符(用来控制正则表达式匹配的模式)

看懂上面那个 match 函数的例子,这个就很简单了:

import re


print(re.search('www', 'www.runoob.com').span())
print(re.search('com', 'www.runoob.com').span())

line = "Cats are smarter than dogs"
searchObj = re.search(r'(.*) are (.*?) .*', line, re.M | re.I)

if searchObj:
   print("searchObj.group() : ", searchObj.group())
   print("searchObj.group(1) : ", searchObj.group(1))
   print("searchObj.group(2) : ", searchObj.group(2))
else:
   print("Nothing found!!")

输出:

(0, 3)
(11, 14)
searchObj.group() :  Cats are smarter than dogs
searchObj.group(1) :  Cats
searchObj.group(2) :  smarter

re.compile()

compile () 用于编译正则表达式,返回一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。

函数语法:
re.compile(pattern[, flags])

  • pattern : 一个字符串形式的正则表达式
  • flags:可选标志修饰符(用来控制正则表达式匹配的模式)
import re

# 返回一个用于匹配至少一个数字的正则表达式对象, 给match()和search()调用
pattern = re.compile(r'\d+')

# 从起始位置开始匹配,没有匹配到,返回 None
m = pattern.match('one12twothree34four')
print(m)

# 把'e'的位置作为起始位置匹配,没有匹配到,返回 None
m = pattern.match('one12twothree34four', 2, 10)
print(m)

# 把'1'的位置作为起始位置匹配,正好匹配
m = pattern.match('one12twothree34four', 3, 10)
print(m)

print(m.group())
print(m.start())
print(m.end())
print(m.span())

输出:

None


12
3
5
(3, 5)
import re

print(re.match('www', 'www.runoob.com'))  # 在起始位置匹配, 返回对象
print(re.match('com', 'www.runoob.com'))  # 不在起始位置匹配, 返回None

""" 在用pattern调用match()或者search()时,里面有两个参数:
    pos:指定起始匹配位置的索引    endpos: 指定结束位置的索引+1 """
pattern = re.compile('com')
print(pattern.match('www.runoob.com'))
print(pattern.match('www.runoob.com', pos=11, endpos=14))

输出:


None
None

re.findall()

findall() 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。(注意: match 和 search 是匹配一次,findall 是匹配所有)

函数语法:
findall(string[, pos[, endpos]])

  • string:待匹配的字符串
  • pos:可选参数,指定字符串的起始位置,默认为 0
  • endpos:可选参数,指定字符串的结束位置,默认为字符串的长度
 import re

pattern = re.compile(r'\d+')  # 查找数字

result1 = pattern.findall('runoob 123 google 456')

# 同样也是在pattern调用findall()才会有pos和endpos参数
result2 = pattern.findall('run88oob123google456', 0, 10)
result3 = re.findall(pattern, 'run88oob123google456')
result4 = re.findall(r'\d+', 'run88oob123google456')

print(result1)
print(result2)
print(result3)
print(result4)

输出:

['123', '456']
['88', '12']
['88', '123', '456']
['88', '123', '456']

re.split()

split() 按照匹配的子串将字符串分割后返回列表

函数语法:
re.split(pattern, string[, maxsplit=0, flags=0])

  • pattern:匹配的正则表达式
  • string:被匹配的字符串
  • maxsplit:分隔次数,maxsplit = 1 分隔一次,默认为 0,不限制次数
  • flags:可选标志修饰符(用来控制正则表达式匹配的模式)
import re

pattern = re.compile(r'\d+')  # 查找数字

result1 = pattern.findall('runoob 123 google 456')

# 同样也是在pattern调用findall()才会有pos和endpos参数
result2 = pattern.split('run88oob123google456', 0, 10)
result3 = re.findall(pattern, 'run88oob123google456')
result4 = re.findall(r'\d+', 'run88oob123google456')

print(result1)
print(result2)
print(result3)
print(result4)

输出:

['runoob,', 'runoob,', 'runoob.']
['', ' ', 'runoob,', ' ', 'runoob,', ' ', 'runoob.']
['', 'runoob, runoob, runoob.']
['', 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '']
['', 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '']

你可能感兴趣的:(Python)