13 - 字符串与正则表达式

1.正则表达式简介

正则表达式用于搜索、替换和解析字符串。Python提供了re模块进行正则表达式的验证。

正则表达式由字母、数字和特殊字符(括号、星号、问好等)组成

特殊字符含义:

  • ^ 开始字符
  • $ 结束字符
  • . 匹配任意字符(包括汉字)
  • [m] 匹配单个字符串
  • [m1m2 ... n] 匹配多个字符串
  • [m-n] 匹配m到n之间的数字、字母
  • [^m] 匹配除m以外的字符串
  • ( ) 对表达式进行分组
  • \w 匹配字母、数字、下划线
  • \W 匹配非字母、数字、下划线
  • \s 匹配空白字符
  • \S 匹配非空白字符
  • \d 匹配数字
  • \D 匹配非数字
  • \b 匹配单子的开始和结束
  • \B 匹配非单词开始和结束

常用限定符:

  • * 匹配0次或更多次
  • + 匹配1次或更多次
  • ? 匹配0或1次
  • {m} 重复m次
  • {m, n} 重复m到n次。n可省略,表示m到任意次。

匹配电话号码:

\d{3} - \d{8} | \d{4} - \d{7}   #如:010 - 12345678

考虑更多情况:

[\(-]? \d{3} [\)-]? \d{8}  |  [\(-]? \d{4} [\)-]? \d{7}   #如:01012345678、(010)12345678等

注意,()是特殊字符,需要转义才能输出;-不是特殊字符,无需转义

2.使用 sys.re 模块处理正则表达式

常用函数:
- findall(pattern, string, flags) 查找全部匹配项
- sub(pattern, repl, string, count) 替换
- subn(pattern, repl, string, count) 同上
- match(pattern, string, flags) 只返回第一次匹配成功的对象。必须从第0个索引位开始匹配,否则匹配失败。
- search(pattern, string, flags) 只返回第一次匹配成功的对象
- compile(pattern, string, flags) 编译正则表达式,返回Pattern对象
- split(pattern, string, maxsplit) 分隔字符串
- escape(pattern) 匹配特殊字符,如*+?

常用flags:
- I(或IGNORECASE) 忽略大小写
- L(或LOCALE) 字符集本地化
- M(或MULTILINE) 多行匹配
- S(或DOTALL) 使”.”匹配包括”\n”在内的所有字符
- X(或VERBOSE) 忽略表达式中的空白换行等等,方便添加注释
- U(或UNICODE)

实例:

import re

s = "HELLO WORLD"
print(re.findall(r"^hello", s))
print(re.findall(r"^hello", s, re.I))    #忽略大小写
print(re.findall(r" \b \w + \b", s))    #匹配单词

正则表达式解析非常费时 ,如果多次使用findall()的方式匹配 字符串,搜索效率可能很低下。可以使用compile()函数进行预编译,返回一个pattern对象。该对象拥有一系列的方法用于查找、替换、扩展字符串,从而提高匹配速度。

import re
s = "1asdf23hg45"
p = re.compile(r"\d +")    #匹配数字
print(p.findall(s))

match()和search()函数

正则表达式从左往右计数,第一个出现的圆括号为第1组,以此类推。此外0号组用于匹配整个正则表达式的结果。match()和search()函数返回一个match对象,这个对象提供了一系列的方法和属性用来管理匹配的结果:

  • group(index) 某个分组的匹配结果。如index=0, 则匹配整个字符串
  • groups() 所有分组的匹配结果
  • groupdict() 返回key为组名,value为每个分组匹配结果的字典
  • re 正则表达式对象
  • string 搜索的字符串

示例如下:

import re 
p = re.compile(r"(abc) \1")
m = p.match("abcabcabc")
print(m.group(0))
print(m.group(1))
print(m.group())

p = re.compile(r"(? P<one> abc) (? P=one)")     # ? P<one> 中的 one 表示分组名称,(? P=one) 调用分组 one ,相当于 \1
m = p.search("abcabcabc")
print(m.group("one"))
print(m.groupdict().keys())
print(m.groupdict().values())
print(m.re.pattern)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值