Python正则表达式模块re

24次阅读
没有评论

共计 1530 个字符,预计需要花费 4 分钟才能阅读完成。

元字符匹配

单字符匹配:

字符 功能
. 匹配任意字符,除了 \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"))  # 结果为:周杰伦

正文完
post-qrcode
 0
三毛
版权声明:本站原创文章,由 三毛 于2023-08-17发表,共计1530字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)