Python字符串处理算法 (一)


CIC内部的核心软件系统都是搭建在linux上的,为了方便程序间的协同操作,我们还编写了很多shell script,尽管类似grep, sort, cut之类的工具用起来很爽很强大,但是shell 脚本并不适于描述稍微复杂些的逻辑跟算法,譬如我曾经写过这样的代码,猜猜它是做什么的

text=abcde
echo $text|sed -r 's/(.)//1 /g'|cut -d" " -f1,2,3|sed 's/ //g'

其实呢,就是取字符串 'abcde' 的前三位,输出结果是 'abc'

如果程序里充满类似的代码,不难想象其可读性和可维护性都不会好到哪里去,因此我们正在尝试其他的脚本作为补充,Python就是一个理想的选择。为什么 没选其他语言呢,答案很简单:据说Google也用Python... 他们的选择总归不会太糟,我们也就懒得花时间挑了。

Python来实现上面同样的功能,很简单, text="abcde";text[0:3]

作为我个人学习的一部分,我打算用Python实现《算法导论II 中的一些经典算法,并且记录下来,和大家分享

我首先选择了第32章,即字符串匹配作为这系列文章的开始,毕竟我们内部的程序涉及大量的文本分析操作,用Python 来重新实现其中一些,也是温故知新,会更有效果。

在实现的过程中我发现,Python 语法和书中伪码很相像,加上命令的执行可以立竿见影,实在是非常适合用于教学的语言。只是需要注意的是书中伪码的字符串起始下标为1,结束下标是闭区间, Python中字符串起始下标为0(当作一个list进行slice), 操作时的结束下标为开区间。因此书中伪码翻译为Python时所有字符串起始下标都需要减1,而结束下标不变。

先用Python的语法简单描述一下何谓字符串匹配算法,一些对变量的大小约束这里不再赘述。

假设有长度为 m 的模式字符串 P 长度为 n 的文本 T,如果 P 出现在 T 的偏移 s 处,则有 P[0:m] = T[s-1: s+m]

说到这里,我们可以先在Python的交互环境中实验一下:

输入
p="cde"
t="abcde"
p[0:3] == t[2:5] == "cde"

输出
True

从而证明 p 出现在 t 的偏移 2

那么什么是字符串匹配算法呢,这类算法就是要在文本 T 中找到所有出现模式字符串 P 的偏移位置。

接下来同样用Python的语法来描述一些术语

有两个字符串变量 x y

x
y 相结合(concatenation):  x+y
x
y 的前缀(prefix):         x.startswith(y)
x
y 的后缀(suffix):         x.endswith(y)
x
的包含k个字符的前缀:         x[0:k-1]

智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告