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

推荐订阅源

D
Docker
G
Google Developers Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
GbyAI
GbyAI
V
Vulnerabilities – Threatpost
Hugging Face - Blog
Hugging Face - Blog
I
Intezer
S
Securelist
Forbes - Security
Forbes - Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Jina AI
Jina AI
Y
Y Combinator Blog
N
News | PayPal Newsroom
S
Schneier on Security
O
OpenAI News
T
The Blog of Author Tim Ferriss
V
Visual Studio Blog
Simon Willison's Weblog
Simon Willison's Weblog
Martin Fowler
Martin Fowler
人人都是产品经理
人人都是产品经理
雷峰网
雷峰网
NISL@THU
NISL@THU
阮一峰的网络日志
阮一峰的网络日志
WordPress大学
WordPress大学
N
News and Events Feed by Topic
Microsoft Azure Blog
Microsoft Azure Blog
P
Proofpoint News Feed
The Cloudflare Blog
Last Week in AI
Last Week in AI
博客园 - 司徒正美
L
LangChain Blog
C
CERT Recently Published Vulnerability Notes
L
LINUX DO - 热门话题
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
aimingoo的专栏
aimingoo的专栏
Apple Machine Learning Research
Apple Machine Learning Research
Recent Commits to openclaw:main
Recent Commits to openclaw:main
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
The Hacker News
The Hacker News
博客园 - Franky
Attack and Defense Labs
Attack and Defense Labs
Security Latest
Security Latest
T
Tailwind CSS Blog
博客园_首页
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Microsoft Security Blog
Microsoft Security Blog
V2EX - 技术
V2EX - 技术
腾讯CDC
V
V2EX

博客园 - 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)