注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

与牛熊共舞

2010与牛熊共舞,共同创造一个神话

 
 
 

日志

 
 

Python 字符串操作——我的第二个Python程序  

2011-01-03 08:21:56|  分类: Python |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
  以下经典内容部分多数来自网络,本人只做了很少的修改和删减,对英文字符(即ASCII字符)的操作,因可爱Python的卓越设计,我想很快都能理解。这里重点的是说说Python中对于大字符集(比如GB2312)的操作。 

  Python 截取字符串使用 变量[头下标:尾下标],就可以截取相应的字符串,其中下标是从0开始算起,可以是正数或负数,下标可以为空表示取到头或尾。

# 例1:字符串截取
str = '12345678'
print str[0:1]
>>> 1			# 输出str位置0开始到位置1以前的字符
print str[1:7]		
>>> 234567		# 输出str位置1(第二个字符)开始到位置7之间(不含位置7上的字符8)的字符
num = 168
str = '0000' + str(num)	# 字符串连接(合并)
print str[-5:]		# 输出字符串右5位
>>> 00168			

  Python 使用replace方法替换字符串,具体形式是:“变量.replace("被替换的内容","替换后的内容"[,次数])”,替换次数可以为空,即表示替换所有。replace方法并不对指定原始字符串进行更新操作,而把操作结果临时存放,如需要该值需。比如:

>>> str='12345678'
>>> str.replace ('234','111')     #进行replace操作,结果并未保存
'11115678'
>>> str                                     #这里可看到,str字符串的内容未有任何变动
'12345678'


 

# 例2:字符串替换
str = 'akakak'
str = str.replace('k',' 8')	# 将字符串里的k全部替换为8
print str
>>> 'a8a8a8'		# 输出结果

  Python 查找字符串使用 变量.find("要查找的内容"[,开始位置,结束位置]),开始位置和结束位置,表示要查找的范围,为空则表示查找所有。查找到后会返回位置,位置从0开始算,如果每找到则返回-1。

# 例3:字符串查找
str = 'a,hello'
print str.find('hello')	# 在字符串str里查找字符串hello
>>> 2			# 输出结果

  Python 分割字符串使用 变量.split("分割标示符号"[分割次数]),分割次数表示分割最大次数,为空则分割所有。

例4:字符分割
str = 'a,b,c,d'
strlist = str.split(',')	# 用逗号分割str字符串,并保存到列表
for value in strlist:	# 循环输出列表值
    print value
>>> a			# 输出结果
>>> b
>>> c
>>> d
 
"""
  经典部分暂时告一段落,新的体会随时补上。下面谈一下有关大字符集的字符串操作。
  这个程序的主要思路是从一个GB2312的页面里获取需要的链接地址,然后将每个链接(二级链接)的内容处理后存入数据库。这里面主要的操作有获取页面后的链接匹配、二级链接内的文本内容的处理、处理结果的入库等,其中二级链接的处理需要做一些大字符集的字符串处理。
url="http://data.****.com/stock/lhb.html"
s = urllib.urlopen(url).read() #获得上面链接地址的页面内容
urls = re.findall(r'<a href="/stock/lhb,.*?._blank.*?<\/a>',s,re.I) #这里获取页面中二级链接地址
#注意上面的urls是数组的形式,我们的目的是获得这个数组中每一个链接地址的页面内容,并对其进行处理。
    s = urllib.urlopen(urled[0]).read() #这里仅以第一个二级链接为例说明,这里获得了这个二级页面的内容
    s = s[s.find(poshead)+13:s.find(posend)+8]   #我们只对部分内容感兴趣,所以对获得的页面进行截取
    s = re.sub(r'<(S*?)[^>]*>.*?|<.*? /> ','',s) #对截取的内容去除所有的超文本标记
    ss = s.replace(" ","") #这里面的空格也不需要
    ss = re.sub(r'(\r\n)+','\r\n',ss)  #把多个换行符替换成一个
ss = ss.replace('\r\n','/') #把换行符用一个斜杠替代
#一直到这里,我们看到,在对字符串(也就是我们获得的这个页面s,以及赋值后的ss)的ASCII操作,都非常的顺利,那么能不能代表对其中汉字的处理也能正常呢?下面就来做一下试验。
   此时我们获得的页面字符串已经处理成以下的形式了:
    "2010年12月31日/收盘价:4.……"
    但事实上,如果我们想定位其中的“日/”的位置,用下面的方法能实现吗?
    ri = ss.find("日/")
ri
-1 #很遗憾,我们看到的是-1,也就是说没有匹配到,当然,这不是我们希望看到的结果
    这个问题的来源还是因为字符集,在Python2.x中,字符串是很诡异的一种描述,具体请参考详细的文档,这里不做过多的叙述,在我的测试中,如果是你自己直接赋值的汉字字符串,恭喜你,你可以没有任何麻烦的使用字符串函数或方法,但,如果是从某些渠道,比如页面中获得的,那么,会有一定的麻烦,不论你是否使用Python默认的utf8编码,不论你的目标页面的编码是GB2312还是Utf8或者其他。总之糟糕的一点是,你一定会遇到麻烦,而这个麻烦虽然可能会在已经推出的Python3x中已经改变,但Python2x的困难依旧要面对。在我的第一个程序里,已经初步的涉及到了这个问题,其实都不是多么困难的,只不过,那层没有被捅破的窗户纸你没有找到而已。好了,我来告诉你那层该死的窗户纸在哪里吧(寻找这个窗户,我用了前后六七个小时的时间):
  ss = ss.decode("gb2312") 
  
#将获得的页面中的内容按照页面原有的编码解码为unicode字符串
  ss = ss.encode("utf-8")
  
#对解码后的Unicode字符串进行Utf8编码
    OK,经过人世间的这个轮回后,该字符串就可以正常的被处理了。读者如果想做这个测试,请来邮件索取我的源程序,或者自己写辅助代码从页面里获取源字符串,直接在程序中赋值,是无需死去活来这么一回的。好了,这个时候你再使用字符串操作,应该没有问题了。
ri = ss.find("日/")
ri
12
    下面的代码是处理字符串里面的日期,当然,你也可以用正则表达式的形式获取:
    s_date = ss[0:ss.find("日/")]
    s_date = s_date[s_date.find(':')+3 : ]
    s_date = s_date.replace('年','-')
    s_date = s_date.replace('月','-')
    s_date = s_date.replace('日','')
    print s_date
2010-12-31
  评论这张
 
阅读(1948)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017