第四章 字符串
一、字符集、字符串及其操作
字符串及其操作
字符串可以认为特殊的线性表,但操作不同于线性表,而是作为一个整体使用处理。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的构造操作:
①需要为欲构造的新字符串安排存储;
②再根据被操作串以及操作确定的特定方式,在新存储块里做出所需的新串。
三、字符串匹配(子串查找)
字符串匹配的应用
- 文本查找单词句子,找拼写错误的标识符等。
- 邮件,客户端程序垃圾过滤,查找特定字符串序列
- 搜索引擎技术基础就是从互联网网页中查找匹配的网页
- 防病毒软件,匹配表征病毒的代码片段
无回溯串匹配算法(KMP算法)
一次KMP算法的完整执行包括构造pnext表和实际匹配,设模式串和目标串长度分别为m和n,KMP的算法时间复杂度为O(m+n)。可以认为为O(n),优于朴素匹配算法的O(m*n)
KMP的重要算法是匹配时不需要回溯,支持一边读入一边匹配,不回头重读就不需要保存被匹配的串。在处理从外部获取大量信息时,这种算法很合适。
四、字符串匹配问题
模式:模式的形式,描述的字符串集合如何确定,怎么样匹配。
通配符:’?’可以与任意一个实际字符匹配;’*’可以与任意一串字符匹配。
增强的模式描述语言:普通字符串的基础上增加通配符。
正则表达式
正则是比较复杂的模式描述语言。
简化版本的正则表达式:
1. 任一字符仅匹配其自身;
2. ’ . ’ 匹配任意字符
3. ’ ^ ‘匹配目标串的开头 ’ $ ’ 匹配目标串的结束
4. ’ * ‘前面的字符匹配0个或任意多个相同字符
五、Python正则表达式
元字符(特殊字符): . ^ $ * + ? \ | { } ( ) [ ]
主要操作:
- 生成正则表达式对象:
re.compile(pattern ,flag=0)
从pattern生成与之对应的正则表达式对象。 - 检索:
re.search(pattern,string,flag=0)
在string中检索pattern匹配的子串,如找到就返回一个match类型的对象,否则返回None。 - 匹配:
re.match(pattern,string,flag=0)
检查string是否存在一个与pattern匹配的前缀,成功则返回match类型的对象,否则返回None。 - 分割:
re.split(pattern,string,maxsplit=0,flags=0)
以pattern作为分割串将string分段,maxsplit最大分割数,0是默认处理整个string。返回分割得到的字符串的表。 - 找出所有匹配串:
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)的高效率。
正则表达式的串匹配
近似匹配:定义两个串的接近程度等;
复杂模式匹配:二维或者高位模式匹配。