惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Privacy & Cybersecurity Law Blog
人人都是产品经理
人人都是产品经理
The Cloudflare Blog
B
Blog RSS Feed
罗磊的独立博客
V
V2EX
V
Visual Studio Blog
博客园 - 叶小钗
W
WeLiveSecurity
小众软件
小众软件
K
Kaspersky official blog
美团技术团队
雷峰网
雷峰网
阮一峰的网络日志
阮一峰的网络日志
Martin Fowler
Martin Fowler
Recorded Future
Recorded Future
Project Zero
Project Zero
Hugging Face - Blog
Hugging Face - Blog
Engineering at Meta
Engineering at Meta
Security Latest
Security Latest
Microsoft Azure Blog
Microsoft Azure Blog
V
Vulnerabilities – Threatpost
月光博客
月光博客
博客园 - 三生石上(FineUI控件)
Help Net Security
Help Net Security
博客园 - Franky
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
F
Fortinet All Blogs
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Forbes - Security
Forbes - Security
M
MIT News - Artificial intelligence
H
Hacker News: Front Page
大猫的无限游戏
大猫的无限游戏
Vercel News
Vercel News
Spread Privacy
Spread Privacy
The Register - Security
The Register - Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
Google Online Security Blog
Google Online Security Blog
PCI Perspectives
PCI Perspectives
The Last Watchdog
The Last Watchdog
AI
AI
N
News | PayPal Newsroom
D
DataBreaches.Net
Cloudbric
Cloudbric
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 司徒正美
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog

博客园 - tsembrace

Pandas数据分析教程,由浅入深讲解(五)Pandas IO操作 Pandas数据分析教程,由浅入深讲解(四) Pandas数据分析教程,由浅入深讲解(三) Pandas数据分析教程,由浅入深讲解(二) Pandas数据分析教程,由浅入深讲解(一) B站黑马Python+AI零基础入门(二)AI应用-实战 B站黑马Python+AI零基础入门(一)AI应用-基础 B站清华128小时Python高级教程一(C3深入类和对象) B站清华128小时Python高级教程一(C1、C2) B站python入门学习---第二阶段第二章数据库、SQL和MySQL B站python入门学习---第二阶段第一章类和对象 B站python入门学习---第一阶段第十章 数据可视化 B站python入门学习---第一阶段第八~九章 文件操作、异常、模块与包 B站python入门学习---第一阶段前七章回顾复习(二) B站python入门学习---第一阶段前七章回顾复习(一) Python入门学习(十)第十四章其他 Python入门学习(九)Python的高级语法与用法(四)装饰器 Python入门学习(九)Python的高级语法与用法(三)函数式编程 Python入门学习(九)Python的高级语法与用法(二)闭包 Python入门学习(九)Python的高级语法与用法(一)枚举 Python入门学习(八)JSON、反序列化、序列化 Python入门学习(七)高级部分:正则表达式(二) Python入门学习(六)高级部分:面向对象 Python入门学习(五)函数 Python入门学习(四)流程控制 包与模块
Python入门学习(七)高级部分:正则表达式
tsembrace · 2025-07-28 · via 博客园 - tsembrace

一、定义

正则表达式是一个特殊的字符序列,可以检测一个字符串是否与设定的字符序列相匹配。可以实现文本字符快速检索、替换等功能。

import re
a = "C|C++|Java|C#|Python|Javascript|Python"
#已有以下两种方式判断某字符串是否在指定文本中
print(a.index("Python") > -1)
print("Python" in a)

#以下为正则表达式最基本的方法findall,只是参数设为常数
r = re.findall("Python", a)
if len(r) != 0:
    print("字符串a中包含Python")
    print(r)
else:
    print("Not exit!")

二、元字符与普通字符

普通字符即是a-z,0-9,A-Z,标点符号这些所有的非元字符。

元字符是指特定指代某些特殊含义的字符。如/d匹配一个数字字符,等价于[0-9];/D匹配一个非数字字符,等价于[^0-9];\n匹配一个换行符;\s匹配任意的不可见字符,包括空格、制表符、换页符等;\S匹配任意的课件字符;[a-z]、[A-Z]匹配指定范围内的任意字符;\b匹配一个单词边界,即指单词和空格之间的位置,如“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的"er";\B匹配一个非单词边界.....等等。

import re
a = "C0C++7Java8C+9Python6Javascript"

#提取a中的数字,参数设为表示0~9的正则表达式
#\d即为元字符,表示数字
r = re.findall("\d", a)
print(r)

#提取a中的非数字
r1 = re.findall("\D", a)
print(r1)

三、字符集

出现在字符集中的字符之间是“或”的关系,即均可匹配,如[cf],既匹配c也匹配f。

#字符集

import re
s = "abc, acc, adc, aec, afc, ahc"

#找出中间一个字符是c或者f的字符串/单词
#通过普通字符a\c定界
#再通过字符集设定我们的需求
r1 = re.findall("a[cf]c", s)

#匹配中间字符非c非f非d的字符串/单词
r2 = re.findall("a[^cfd]c", s)

#匹配中间字符为一段字符中任一字符的字符串/单词
r3 = re.findall("a[c-f]c", s)

print(r1)
print(r2)
print(r3)
import re

s = "python@11 11\tjava&67\n8__php\rC++"

#匹配字符串中的所有数字
r1 = re.findall("\d", s)
#也可以如下明确的字符集方式
r2 = re.findall("[\d]", s)
#也可以如下:
r3 = re.findall("[0-9]", s)
r4 = re.findall("[^\D]", s)

print(r1)
print(r2)
print(r3)
print(r4)
#如要匹配字符串中所有数字和字母
#可以用\w,该元字符表示数字和字母和下划线,即只能匹配单词字符
r5 = re.findall("\w", s)
#也可以如下
r6 = re.findall("[0-9a-zA-Z_]", s)

print(r5)
print(r6)

#非单词字符则是用\W来匹配
r7 = re.findall("\W", s)
print(r7)
#空格、制表符、换行等称为空白字符,可用\s表示
r8 = re.findall("\s", s)
print(r8)

 四、数量词

#数量词
import re

a = "python 1111java678php"

r1 = re.findall("[a-zA-Z]", a)
#但这样只能匹配到单个字符
print(r1)
#如何按单词的方式去匹配呢
#可以在匹配组合后面加上数量,这就称为数量词
r2 = re.findall("[a-zA-Z]{3}", a)
print(r2)
#而且数量词可设为一个区间
r3 = re.findall("[a-zA-Z]{3,6}", a)
print(r3)

数量词的匹配模式:贪婪与不贪婪

贪婪即是指:如上代码对于[a-zA-Z]{3,6}这样的正则表达式,匹配字符串a时,因为设置的匹配数量是3到6,当匹配到"pyt"时已经满足正则表达式的要求了,这时候是输出呢还是继续匹配呢?

python中默认是继续匹配——即贪婪模式,直到匹配不到,或者已经超出设置的数量范围才输出。贪婪即要匹配更多...

如要设置为非贪婪模式,则在数量词后面加?即可:

import re

a = "python 1111java678php"

#默认为贪婪匹配模式
r3 = re.findall("[a-zA-Z]{3,6}", a)
print(r3)

#非贪婪模式
r4 = re.findall("[a-zA-Z]{3,6}?", a)
print(r4)

其实非贪婪模式下的{3,6}?与{3}作用类似。

除了上述的方式,数量词还有用*表示匹配*前面的字符0次或者无限多次;+匹配+前面的字符1次或者无限多次;?匹配?前面的字符0次或者1次。

#数量词
import re

a = "pytho0python1pythonn2"
b = "pyth111pythoner333pythonnnn555"

#*匹配0次或无限多次
#具体就是对*前面一个字符"n"可以出现0次或者无限次
r1 = re.findall("python*", a)
r2 = re.findall("python*", b)
print(r1)
print(r2)

#+是匹配1次或无限多次
r3 = re.findall("python+", a)
print(r3)

#?是匹配0次或者1次
#此时也涉及当即可以匹配0次又可以匹配1次的时候,默认是匹配1次
r4 = re.findall("python?", a)
print(r4)

#组合用法
r5 = re.findall("python{1,2}", a)
print(r5)

五、边界匹配、组、匹配模式参数

#边界匹配
import re
QQ_number = "100000001"
#验证是否为QQ号码,默认QQ号码为4~8位
#^表示从字符串第一个字符开始匹配
#$表示从字符串最后一个或几个字符也得匹配
r = re.findall("^\d{4,8}$", QQ_number)
print(r)
if r !=[]:
    print("是QQ号码!")
else:
    print("不是QQ号码!")
#
import re
a = "PythonPythonPythonPythonPython"

#要求判断a中是否包含3个python
#需要成组的字符用()组合
#要注意[]里的字符是或的关系,()里的字符是且的关系,即组合。
r1 = re.findall("(Python){3}", a)
print(r1)
#匹配模式参数
import re

language = "PythonC#\nJavaPHP"
#第三个参数即为模式参数
#设为re.I为忽略字母大小写
r = re.findall("c#", language, re.I)
print(r)
#设为re.S 为设置"."匹配所有字符(含换行符)
r1 = re.findall("C#.{1}", language, re.S)
print(r1)
#也可以组合使用,|是且的关系
r2 = re.findall("c#.{1}", language, re.I | re.S)
print(r2)