展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

正则表达式

  • 匹配单个字符
. 表示要匹配除了 换行符 之外的任何 单个 字符。

# 案例
苹果是绿色的
.色 会匹配 绿色
  • 代码案例
content = '''苹果是绿色的
橙子是橙色的
香蕉是黄色的
乌鸦是黑色的'''

import re
p = re.compile(r'.色')
for one in  p.findall(content):
    print(one)
  • 匹配多个字符
* 表示匹配前面的子表达式任意次,包括0次。

# 案例:色字出现0次或多次
苹果是绿色色的
色* 会匹配 色色

# 案例:任意单个字符出现多次
苹果是绿色色的
绿.* 会匹配 绿色色的
  • 匹配多个字符
+ 表示匹配前面的子表达式一次或多次,不包括0次。
# 案例:色字出现至少1次或多次
苹果是绿色色的
色+ 会匹配 色色

# 案例:任意单个字符出现多次
乌鸦,是黑色的
猴子,
,.+ 会匹配 ,是黑色的

  • 匹配指定次数
表达式 油{3} 就表示匹配 连续的 油 字 3次
表达式 油{3,4} 就表示匹配 连续的 油 字 至少3次,至多 4 次
  • 贪婪模式
# 匹配所有html标签,结果为['<html><head><title>Title</title>']
source = '<html><head><title>Title</title>'

import re
p = re.compile(r'<.*>')

print(p.findall(source))
  • 非贪婪模式
# 匹配所有html标签
source = '<html><head><title>Title</title>'

import re
# 注意多出的问号
p = re.compile(r'<.*?>')

print(p.findall(source))

  • 转义字符
\. 表示匹配 .

# 案例
content = '''苹果.是绿色的
橙子.是橙色的
香蕉.是黄色的'''

import re
p = re.compile(r'.*\.')
for one in  p.findall(content):
    print(one)

\d 匹配0-9之间任意一个数字字符,等价于表达式 [0-9]

\D 匹配任意一个不是0-9之间的数字字符,等价于表达式 [^0-9]

\s 匹配任意一个空白字符,包括 空格、tab、换行符等,等价于表达式 [\t\n\r\f\v]

\S 匹配任意一个非空白字符,等价于表达式 [^ \t\n\r\f\v]

\w 匹配任意一个文字字符,包括大小写字母、数字、下划线,等价于表达式 [a-zA-Z0-9_]
缺省情况也包括 Unicode文字字符,如果指定 ASCII 码标记,则只包括ASCII字母

\W 匹配任意一个非文字字符,等价于表达式 [^a-zA-Z0-9_]
  • 缺省情况也包括 Unicode文字字符

  • 只包含英文

  • 匹配指定字符
[abc] 可以匹配 a, b, 或者 c 里面的任意一个字符。等价于 [a-c] 。
[a-c] 中间的 - 表示一个范围从a 到 c。

一些元字符在方括号内失去了意义,变得和普通字符一样了。
[akm.] 匹配 a k m . 里面任意一个字符

如果在方括号中使用 ^ , 表示 非 方括号里面的字符集合。
[^\d] 表示,选择非数字的字符
  • 起始位置、结束位置
正则表达式可以设定 单行模式 和 多行模式
如果是 单行模式 ,表示匹配 整个文本 的开头位置。
如果是 多行模式 ,表示匹配 文本每行 的开头位置。

^ 表示匹配文本的 开头 位置
$ 表示匹配文本的 结尾 位置。
  • 使用多行模式
content = '''001-苹果价格-60
002-橙子价格-70
003-香蕉价格-80'''

import re
p = re.compile(r'\d+$', re.MULTILINE)
for one in  p.findall(content):
    print(one)
  • 分组
content = '''苹果,苹果是绿色的
橙子,橙子是橙色的
香蕉,香蕉是黄色的'''

import re
p = re.compile(r'^(.*),', re.MULTILINE)
for one in  p.findall(content):
    print(one)

content = '''张三,手机号码15945678901
李四,手机号码13945677701
王二,手机号码13845666901'''

import re
p = re.compile(r'^(.+),.+(\d{11})', re.MULTILINE)
for one in  p.findall(content):
    print(one)
  • 切割
import re

names = '关羽; 张飞, 赵云,   马超, 黄忠  李逵'

namelist = re.split(r'[;,\s]\s*', names)
print(namelist)
  • 替换
import re

names = '''
<a href='https://www.bilibili.com/video/av66771949/?p=1' target='_blank'>点击这里,边看视频讲解,边学习以下内容</a>
这节讲的是牛顿第2运动定律

<a href='https://www.bilibili.com/video/av46349552/?p=125' target='_blank'>点击这里,边看视频讲解,边学习以下内容</a>
这节讲的是毕达哥拉斯公式

<a href='https://www.bilibili.com/video/av90571967/?p=33' target='_blank'>点击这里,边看视频讲解,边学习以下内容</a>
这节讲的是切割磁力线
'''

# 替换函数,参数是 Match对象
def subFunc(match):
    # Match对象 的 group(0) 返回的是整个匹配上的字符串,
    src = match.group(0)
    # Match对象 的 group(1) 返回的是第一个group分组的内容
    number = int(match.group(1)) + 6
    dest = f'/av{number}/'
    print(f'{src} 替换为 {dest}')
    # 返回值就是最终替换的字符串
    return dest

newStr = re.sub(r'/av(\d+?)/', subFunc, names)
print(newStr)
  • 控制台打印
/av66771949/ 替换为 /av66771955/
/av46349552/ 替换为 /av46349558/
/av90571967/ 替换为 /av90571973/

<a href='https://www.bilibili.com/video/av66771955/?p=1' target='_blank'>点击这里,边看视频讲解,边学习以下内容</a>
这节讲的是牛顿第2运动定律

<a href='https://www.bilibili.com/video/av46349558/?p=125' target='_blank'>点击这里,边看视频讲解,边学习以下内容</a>
这节讲的是毕达哥拉斯公式

<a href='https://www.bilibili.com/video/av90571973/?p=33' target='_blank'>点击这里,边看视频讲解,边学习以下内容</a>
这节讲的是切割磁力线
posted @ 2022-10-21 10:40  DogLeftover  阅读(25)  评论(0编辑  收藏  举报