python3正则表达式使用说明

常用方法

  • re.match 从开始匹配
  • re.search 查找第一个匹配的
  • re.sub 替换字符串
  • re.compile 生成正则对象
  • re.findall 查找所有匹配的,返回匹配的列表
  • re.finditer 查找所有匹配的,返回一个迭代器

re.match

从字符串开头匹配,匹配成功返回一个匹配的对象,否则返回None。
re.match(pattern, string, flags=0)

import re
str1 = 'hello world'
res = re.match(r'\w', str1)
print(res)

<re.Match object; span=(0, 1), match='h'>

我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

匹配对象方法 描述
group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
span() 返回一个元组包含匹配 (开始,结束) 的位置
start() 返回匹配开始的位置
end() 返回匹配结束的位置

re.search

返回在字符串中第一个匹配成功的
re.search(pattern, string, flags=0)

import re

result = re.search(r'e', 'agehellosexworldany')
print(result)
print(result.group())
# 返回匹配成功的位置
print(result.span())

<re.Match object; span=(2, 3), match='e'>
e
(2, 3)

re.sub

替换字符串中的匹配项
re.sub(pattern, repl, string, count=0, flags=0)

参数 说明
pattern 正则中的模式字符串。
repl 替换的字符串,也可为一个函数。
string 要被查找替换的原始字符串。
count 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
flags 编译时用的匹配模式,数字形式。
import re

# 将号码里的-替换成#
print( re.sub(r'-', '#', '138-3838-3838') )

# 将-替换成空字符串
print( re.sub(r'-', '', '138-3838-3838') )

# 去点所有非数字
print( re.sub(r'\D', '', '138-3838-3838') )

138#3838#3838
13838383838
13838383838

re.compile

用于编译正则表达式,生成一个正则表达式( Pattern )对象
re.compile(pattern[, flags])

import re

# 生成正则表达式对象
regexp = re.compile(r'\D')

# 用生成的对象调用正则方法
print(regexp.sub('', '138-3838-3838'))

result = re.compile(r'\d').search(r'hell996oworld')
print(result)
print(result.span())
print(result.group())

13838383838
<re.Match object; span=(4, 5), match='9'>
(4, 5)
9

findall

在字符串中找到所有匹配的子字符串,返回一个列表,没有匹配的,则返回空列表。
re.findall(string[, pos[, endpos]])

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

# 匹配所有数字
result = re.findall(r'\d+', r'helloworld1383838asd115sls')
print(result)

['1383838', '115']

re.split

按照匹配的子字符串分割字符串,返回分割的列表
re.split(pattern, string[, maxsplit=0, flags=0])

import re

# 以逗号分割,并返回列表
result = re.split(r',', '100,101,102,103,104,105')
print(result)

# 以空格分割,并返回列表
result = re.split(r'\s+', '100 102  102     103 104 105')
print(result)

['100', '101', '102', '103', '104', '105']
['100', '102', '102', '103', '104', '105']

re.finditer

在字符串中找到匹配的所有子字符串,并把它们作为一个迭代器返回。
re.finditer(pattern, string, flags=0)

import re

result = re.finditer(r'\d', 'he1,sdfhasdlfaoasdafsa92')
print(result)

for item in result:
    print(item)
    print(item.group())

<callable_iterator object at 0x000000FB9932C668>
<re.Match object; span=(2, 3), match='1'>
1
<re.Match object; span=(22, 23), match='9'>
9
<re.Match object; span=(23, 24), match='2'>
2

分组匹配

import re

# 匹配数字并分组
result = re.search(r'(?P<g1>[0-9]{2})(?P<g2>[0-9]){4}', '123456789')
print(result.group())
print(result.groupdict())

# 匹配路径下的用户名
result = re.search(r'/admin/(?P<user>[a-z]+)', '/admin/zhangsan')
print(result.groupdict())

123456
{'g1': '12', 'g2': '6'}
{'user': 'zhangsan'}

可选标志位 flag

多个标志通过 | 来分隔

修饰符 说明
re.I 忽略大小写
re.S 使 . 匹配包括换行在内的所有字符
re.M 多行匹配,影响 ^ 和 $

标志位实例

import re

html = """
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>hello</title>
</head>
<body>
    <div>
        <ul>
            <li>1000</li>
            <li>1001</li>
            <li>1002</li>
        </ul>
    </div>
</body>
</html>
"""

# 匹配标题
result = re.search(r'<title>(.*?)</title>', html)
print(result.group())
print(result.group(1))

<title>hello</title>
hello

# 只匹配一行
result = re.search(r'<li>(.*)</li>', html)
print(result.group())

<li>1000</li>

# 多行匹配
result = re.findall(r'<li>(.*?)</li>', html, re.S)
print(result)

['1000', '1001', '1002']

常用正则表达式

自己去百度吧,啊哈哈~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。