python的字符串

虽然也算勉强接触过几天了,但对python的了解还是很少的,今天看了一个pythonchallenge的过关挑战,做起来很费劲,第0关是参考别人的方法过的,到了第一关,也花了一上午,但是只翻译了那密文成明文,根本就不知道有个str.maketrans这个方法,所以就不知道怎么做了,而且python虽然有个文档,但没有发现像JAVA一样的API,因此只得参考网上的实现,最后看了一下官方的实现,比较好:

import string
text="""g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr
amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q
ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb.
lmu ynnjw ml rfc spj."""
table = str.maketrans(string.ascii_lowercase,
string.ascii_lowercase[2:]+string.ascii_lowercase[:2])
s=str.translate(text,table)
print(s)


这里有个maketrans(from,to),把from相应位置的字符替换成to相应位置的字符,因此这个两个字符串的个数要相等。translate则是将maketrans定义的规则用于具体的字符串中。"""三个引用表示多行文本。

新版3.1中,有个bytes.translate(table[, delete])与bytes.maketrans(from, to) 方法取代了str.translate(table[, delete])、str.maketrans(from, to),bytes拥有str的所有方法,其实bytes到底有多大用,目前还不清楚,有可能是为了国际化吧,上面的代码可以改成这样:

import string
text="""g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr
amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q
ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb.
lmu ynnjw ml rfc spj."""
table=bytes.maketrans(bytes(string.ascii_lowercase,encoding="utf-8"),
bytes(string.ascii_lowercase[2:]+string.ascii_lowercase[:2],encoding="utf-8"))
s=bytes.translate(bytes(text,encoding="utf-8"),table)
print(s)

可以看出,出了多了个字节编码以外,没什么不同的。

还有一种方法也非常好:

s="g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb.  lmu ynnjw ml rfc spj."
o=""
for x in s:
	if ord(x)>=ord('a') and ord(x)<=ord('z'):
		o+=chr((ord(x)+2-ord('a'))%26+ord('a'))
	else:
		o+=x
print o


chr()方法作用是把相应的ascii码转换成字符,ord()表示将字符转换成相应的ascii。如果需要遍历索引可以这样for i,x in enumerate(s):...

关于str有些比较灵活的用法:
seq[start]
seq[start:end]
seq[start:end:step]
其实这种方式也适用于list,tuple(数组),如果省略了start,则默认为0,如果省略了end,则默认为len(s),因此s[:]与s[0:len(s)]是一样的,而step有点让人迷惑,如果要用上面的第三种方式,step的值是不能省略,表示跨度的意思,如s="abcdefg",则s[::2]='aceg',在,且step出可以为负数,如s[::-1]='gfedcba'。

值得注意的是,如果用ruby,代码更加简单:
text="g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr
amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q
ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb.
lmu ynnjw ml rfc spj."
text.tr('a-z','c-zab')



有空又看了一下第2关,这一关也是关于字符串的处理,就是把源代码中那些很多的散乱字符去掉就行了,直接把段字符复制放在一个文件sr.txt中,去掉相应的非法字符即可:

import string
text=open('e:/sc.txt').read()
bytes(text,encoding="utf-8").translate(None,bytes(string.punctuation+"\n",encoding="utf-8"))

这道题有很多中解法,有空再贴出来。

使用ruby也很简单:

s=open('e:/sc.txt').read()
p s.scan(/[a-z]/).join()

你可能感兴趣的:(python,Ruby)