第四章 字符串

本文介绍Python中字符串的基本操作、实现原理及KMP算法,同时深入探讨正则表达式的使用方法,包括常见元字符、主要操作及构造规则。

第四章 字符串

一、字符集、字符串及其操作

字符串及其操作

字符串可以认为特殊的线性表,但操作不同于线性表,而是作为一个整体使用处理。python没有字符类型,所以返回的都是字符串对象。
1. 字符串的长度
2. 字符在字符串的位置
3. 字符串相等
4. 字典序
5. 字符串拼接
6. 字串关系
7. 前缀和后缀都是两种特殊子串
8. 其他有用的串运算

二、字符串的实现

python的字符串

概述:标准类型str是抽象的字符串概念的实现。str是不变类型,其对象创建后内容和长度都不变化,采用一体化顺序表形式。str对象的头部,除了记录字符串长度外,还记录了一些解释器用于管理对象的信息,它们是为系统内部操作服务的。
str的操作:
①获取str对象的信息,获取串长,检查串的内容是否为全为数字等。
②构造新的str对象,切片、构造小写/大写复制、各种格式化等。split()构造包含多个字符串的表。replace就是字符串ADT里的subst
③子串匹配,count检查子串出现次数;endwith检查后缀;find/index找子串的位置。
str的构造操作:
①需要为欲构造的新字符串安排存储;
②再根据被操作串以及操作确定的特定方式,在新存储块里做出所需的新串。

三、字符串匹配(子串查找)

字符串匹配的应用
  1. 文本查找单词句子,找拼写错误的标识符等。
  2. 邮件,客户端程序垃圾过滤,查找特定字符串序列
  3. 搜索引擎技术基础就是从互联网网页中查找匹配的网页
  4. 防病毒软件,匹配表征病毒的代码片段
无回溯串匹配算法(KMP算法)

一次KMP算法的完整执行包括构造pnext表和实际匹配,设模式串和目标串长度分别为m和n,KMP的算法时间复杂度为O(m+n)。可以认为为O(n),优于朴素匹配算法的O(m*n)
KMP的重要算法是匹配时不需要回溯,支持一边读入一边匹配,不回头重读就不需要保存被匹配的串。在处理从外部获取大量信息时,这种算法很合适。

四、字符串匹配问题

模式:模式的形式,描述的字符串集合如何确定,怎么样匹配。
通配符:’?’可以与任意一个实际字符匹配;’*’可以与任意一串字符匹配。
增强的模式描述语言:普通字符串的基础上增加通配符。

正则表达式

正则是比较复杂的模式描述语言。
简化版本的正则表达式:
1. 任一字符仅匹配其自身;
2. ’ . ’ 匹配任意字符
3. ’ ^ ‘匹配目标串的开头 ’ $ ’ 匹配目标串的结束
4. ’ * ‘前面的字符匹配0个或任意多个相同字符

五、Python正则表达式

元字符(特殊字符): . ^ $ * + ? \ | { } ( ) [ ]

主要操作:
  1. 生成正则表达式对象:re.compile(pattern ,flag=0) 从pattern生成与之对应的正则表达式对象。
  2. 检索:re.search(pattern,string,flag=0) 在string中检索pattern匹配的子串,如找到就返回一个match类型的对象,否则返回None。
  3. 匹配:re.match(pattern,string,flag=0)检查string是否存在一个与pattern匹配的前缀,成功则返回match类型的对象,否则返回None。
  4. 分割:re.split(pattern,string,maxsplit=0,flags=0)以pattern作为分割串将string分段,maxsplit最大分割数,0是默认处理整个string。返回分割得到的字符串的表。
  5. 找出所有匹配串:re.findall(pattern,string,flags=0) 返回一个表,表中元素是按顺序给出的string里与pattern匹配的各个子串。
正则表达式的构造:

一、字符组
① 字符组描述符[…]
② (.) 圆点是通配符,能匹配任何字符
二、重复
①重复描述符 ’ * ‘匹配后面任意字符,并且贪婪匹配。 ‘+’至少要做一次匹配的
②可选描述符 ’ ? ‘匹配0次或1次
③重复次数描述符 ‘{n}’ 前面的串匹配n次
④重复次数的范围描述 ‘{m,n}’ 匹配m到n次
三、选择
①选择描述符 ’ | ’ 描述与两种或多种情况之一的匹配。
四、首尾描述符
行首描述符 ‘^’ 以此开头的模式,只能与一行的前缀子串匹配
行尾描述符 ‘$’ 以此结尾的模式,只能与一行的后缀子串匹配
五、单词边界
‘\b’ 描述单词边界
六、匹配对象(match对象)
match.group() 取得被匹配的子串
match.start() 在目标字符串里匹配位置
match.end() 目标串里匹配结束位置
match.span() 目标串里被匹配的区间
七、其他匹配操作
re.fullmatch(pattern,string,flags=0)
re.finditer(pattern,string,flags=0)
re.sub(pattern,repl,string,count=0,flags=0)

本章总结

KMP匹配算法首先分析模式串,记录一套位移信息,而后利用记录的信息实现无回溯匹配。主要思想是尽可能利用好已经做过的字符比较的结果,从而达到O(n)的高效率。
正则表达式的串匹配
近似匹配:定义两个串的接近程度等;
复杂模式匹配:二维或者高位模式匹配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值