Python正则表达式模块re

编程 · 2023-08-17 · 180 人浏览

元字符匹配

单字符匹配:

字符功能
.匹配任意字符,除了\n
[]匹配[]中列举的字符
\d匹配数字,相当于[0-9]
\D匹配非数字
\s匹配空白,即空格、tab键
\S匹配非空白
\w匹配单词字符,即任意字母数字下划线
\W匹配非单词字符

数量匹配:

字符功能
*0或多个,相当于{0,}
+至少一个,相当于{1,}
?0或1个,相当于{0,1}
{m}匹配前一个规则的字符出现m次

边界匹配:

字符功能
^匹配字符串开头
$匹配字符串结尾
\b匹配单词边界
\B匹配非单词边界

分组匹配:

字符功能
``匹配左右任意一个表达式
()将括号中字符作为一个分组

findall()

匹配字符串中所有符合正则的内容(都没找到返回空列表[])。

import re
s = '我的号码是:10086,你的号码是10010'
list = re.findall(r'\d+', s, re.S)
print(list)  # ['10086', '10010']

字符串的r标记,表示当前字符串是原始字符串,即内部的转义字符无效而是普通字符。

re.S的作用是让findall()函数在查找时可以自动考虑换行的影响,使得非贪婪匹配可以匹配换行。

re模块中的标志还有:

  • re.IGNORECASE,忽略大小写
  • re.MULTILINE,多行匹配
  • re.DOTALL,作用类似re.S
# 通过正则表达式获取图片名称title和图片网址src,res为网页源代码
p_title = '<img width="100" alt="(.*?)"'
title = re.findall(p_title, res)
p_img = '<img width="100" alt=".*?" src="(.*?)"'
src= re.findall(p_img, res)

非贪婪匹配:“(.?)”用于提取文本A与文本B之间的内容;“.?”用于代替文本A和文本B之间的内容。

finditer()

匹配字符串中所有符合正则的内容,返回的结果是迭代器。

iter = re.finditer('d+', s)
for i in iter:
    print(i.group())

输出结果如下:

10086
10010

search()

找到一个结果就返回(都没找到返回None),返回结果是match对象。

s = "我的号码是:10086,你的号码是10010"
search = re.search("\\d+", s)
print(search.span())  # (6, 11)
print(search.group())  # 10086

match()

从头开始匹配。

s = '我的号码是:10086,你的号码是10010'
m = re.match('\\d+', s) # 匹配不到
s2 = "10086,10010"
m2 = re.match("\\d+", s2)
print(m2.span())  # (0, 5)
print(m2.group())  # 10086

sub()

sub()函数的名称来自英文单词substitute(替换),语法格式:re.sub(需要替换的内容, 替换值, 原字符串)

预加载正则表达式

s = '我的号码是:10086,你的号码是10010'
obj = re.compile('d+')
ret = obj.finditer(s)
for i in ret:
    print(i.group())

s = "<div class='first'><span id='2'>周杰伦</span></div>"
# (?P<分组名字>正则)可以单独从正则匹配的内容中进一步提取内容
obj = re.compile("<span id='d+'>(?P<name>.*?)</span>", re.S)
result = obj.finditer(s)
for i in result:
    print(i.group("name"))  # 结果为:周杰伦
Python
Theme Jasmine by Kent Liao