正则表达式

re

\d数字,相当于[0-9]
\D非数字字符,相当于 [^0-9]
\s空白字符,相当于[\t\r\n\f\v]
\S非空白字符
\w字母或数字,相当于 [0-9a-zA-z]
\W非字母或数字
.任意字符
|
^非, 或者开始位置标记
$结束位置标记
\b单词边界
\B非单词边界
重复 
*0或任意个字符。添加 ?后缀避免贪婪匹配
0或一个字符
+1或多个字符
{n}n个字符
{n,}最少n个字符
{,m}最多m个字符
{n,m}n到mge字符
编译可以直接在表达式前部加 "(?iLmsux)" 标志
s单行
i忽略大小写
m多行
x忽略多余的空白字符
uUnicode

正则函数

 

re 有几个重要的函数:

  • match(): 匹配字符串开始位置
  • search(): 扫描字符串,找到第一个位置
  • findall(): 找到全部匹配,以列表返回
  • finditer(): 找到全部匹配,以迭代器返回

match 和 search 仅匹配一次,匹配不到返回 None。

>>> import re
>>> s = '12abc345ab'
>>> m = re.match(r'\d+', s)
>>> m.group()
'12'
>>> m.span()
(0, 2)
>>> re.match(r'\d{3,}', s)       # 开始位置有两个数字,不符合,返回None
>>> m = re.match(r'\d{3,}', s)
>>> m is None
True
>>> s = '12abc345ab'
>>> m = re.search(r'\d{3,}', s)
>>> m.group();m.span()
'345'
(5, 8)
>>> m = re.search(r'\d+', s)
>>> m.group();m.span()
'12'
(0, 2)

findall 返回列表,match,search返回MatchObject

>>> re.findall(r'\d+', s)
['12', '345']

finditer 返回迭代器

>>> match_iter = re.finditer(r'\d+', s)
>>> match_iter
<callable_iterator object at 0x7f6cf5e0bcf8>
>>> for m in match_iter:
...     print(m.group())
... 
12
345

MatchObject

  • group(): 返回匹配的完整字符串
  • start(): 匹配的开始位置
  • end(): 匹配的结束位置
  • span(): 包含起始,结束位置的元组
  • groups(): 返回分组信息
  • groupdict(): 返回命名的分组信息
>>> m = re.match(r'(\d+)(?P<str>[abc]+)', s)  # ?P 命名分组
>>> m.group()
'12abc'
>>> m.groups()
('12', 'abc')
>>> m.groupdict()  # 命名的分组
{'str': 'abc'}

start()、end() 和 span() 同样能接收分组序号。和 group() 一样,序号 0 表示示整体匹配结果

>>> s = '12abc345ab'
>>> m = re.match(r'(\d+)(?P<str>[abc]+)', s)
>>> m.start(0); m.end(0)
0
5
>>> m.start(2); m.end(2)
2
5
>>> m.span()
(0, 5)
>>> m.span(2)  # 分组2的起始位置,结束位置
(2, 5)

 

编译标志

可以使用re.l , re.M等参数,也可以直接在表达式中添加(?iLmsux)标志

  • s: 单行,"." 匹配包括换行符在内的所有字符
  • i: 忽略大小写
  • L: 让"\w" 能够匹配当地字符,对中文支持不好
  • m: 多行
  • x:忽略多余的空白字符,让表达式更易阅读
  • u:Unicode
>>> re.findall(r'[a-z]+','%123Abc%45xyz&')
['bc', 'xyz']
>>> re.findall(r'[a-z]+','%123Abc%45xyz&', re.I)
['Abc', 'xyz']

>>> re.findall(r'(?i)[a-z]+', '%123Abc%45xyz&')
['Abc', 'xyz']
>>> 
>>> parttern = r'(\d+)([a-z]+)'

>>> re.findall(parttern, '123Abc%45xyz&', re.I|re.S|re.X)
[('123', 'Abc'), ('45', 'xyz')]
>>> 

 

组操作

命名组:(?P<name>...)

for m in re.finditer(r'(?P<number>\d+)(?P<letter>)[a-z]+', '%123Abc%45xyz&', re.I):
    print(m.groupdict())
# {'number': '123', 'letter': ''}
# {'number': '45', 'letter': ''}

无捕获组:(?....), 作为匹配条件,但不返回

for m in re.finditer(r'(?:\d+)([a-z]+)', '%123Abc%45xyz&', re.I):
    print(m.groups())
    
# ('Abc',)
# ('xyz',)

修改

split: 用parttern 做分割符切割字符串, 如果用 "(parttern)", 那么分隔符也会返回

>>> re.split(r'\W', 'abc,123,x')
['abc', '123', 'x']
>>> re.split(r'(\W)', 'abc,123,x')
['abc', ',', '123', ',', 'x']

sub: 替换子串。可指定替换次数。

>>> re.sub(r'[a-z]+', '*', 'abc,123,x',1)
'*,123,x'

subn: 返回(新字符串, 替换次数)

>>> re.subn(r'[a-z]+', '*', 'abc,123,x',1)
('*,123,x', 1)

将替换字符串改成函数


 

>>> def repl(m):
...     print(m.group())
...     return '*'
... 
>>> re.sub(r'[a-z]', repl, 'abc,123,x')
a
b
c
x
'***,123,*'

 

转载于:https://my.oschina.net/acutesun/blog/979225

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值