python 字符串编程技巧


  • 针对多个分割符号拆分字符串
  • 在字符串开头和结尾做匹配
  • 查找和替换文本
  • 不区分大小写进行匹配
  • 从字符串中去掉不需要的字符
  • 字符串连接及结合问题

?
针对多个分割符号拆分字符串
python中str自带的split()方法可以差分字符串但是只能拆分固定的单个的字符,不如按’ ‘(空格)拆分等
用正则表达式re模块中中的split可以解决这个问题

#从line过滤出多个分割符,提取出需要的内容,提取出需要的
__author__ = 'wwh'

import re

line = 'asdf fasd; asdqw,  asdqw, awsdasd    foo'
#r是原生字符串的意思,会忽略转移字符
#'[;,\s]\s*'意思是匹配[]中任何一个字符包括';',',','\s',在接着可能会包含0个或0个以上的空格字符,\s是空格,*是0个或0个以上
NewLine = re.split(r'[;,\s]\s*', line)
print(NewLine)

这里写图片描述

正则表达式中的split要比str中的split强大的多,它支持正则表达式
不熟悉正则表达式的可以戳 python的正则表达式


?
在字符串开头和结尾做匹配。
比如匹配指定后缀的文件提取出文件名,指定前缀的url
我们可以使用str中的startswith()和endswith()方法

__author__ = 'wwh'

filename = [
    '1.txt',
    '2.py',
    '3.py',
    '4.py',
    '5.c'
]
#过滤出.c和.py结尾的文件,注意endswith和startswith参数是一个元组
print([name for name in filename if name.endswith(('.c', '.py'))])

这里写图片描述


?
查找和替换文本
在给定的字符串中,我们找到指定的字符串并且将它替换掉
简单的替换我们可以用str.replace()来替换,复杂的就要用到re模块的sub方法了

__author__ = 'wwh'

import re
#将11/27/2012日期格式换成2012-11-27`这种
line = 'Today is 11/27/2012, PyCon starts 3/13/2013'
#使用re模块的sub方法
#(\d+)指的是1个或者多个字符,()是捕获组,来捕获指定的字串,'\3-\1-
2'是重新组装日期
ret = re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', line)
print(ret)

这里写图片描述


?
不区分大小写进行匹配
用re.IGNORECASE标记即可,还有其他的标记,比如DOTALL是忽略\n回车的,这在过滤html等文本标记语言非常有用

__author__ = 'wwh'

import re

#过滤出python,要求不区分大小写
line = 'PYTHON, python, PyThOn'
print(re.findall('python', line, re.IGNORECASE))

这里写图片描述


?
从字符串中去掉不需要的字符
我们想在字符串的开头或中间或结尾去除不必要的字符,比如空格等
strip()方法可以帮我们完成这个任务,lstrip()和rstrip()分别从左边和右边开始,默认情况下去除的是空格,注意去除字符不会对字符串中间的字符起作用,可以结合生成器一起使用,过滤剔除字符

__author__ = 'wwh'

line = '  hello world , good moring '
#剔除首尾的空格
print(line.strip(' '))

lines = [
    ' hehe ',
    'ha haha ',
    'xi   xi ',
    ' heihei'
]
#使用生成器
t = (i.strip() for i in lines)
for s in t:
    print(s)

这里写图片描述


?
字符串连接及结合问题
表面上看这个问题没有什么特别之处,但是我们一般会忽略性能这个问题,比如如下代码

s = 'hello '
t = 'world'
for i in range(10):
    s += t

‘+=’ 或者’+’操作能很好的完成字符串连接,但是它的性能是非常低的,原因是内存拷贝和垃圾回收产生的影响。这种做法比下面做法慢很多

__author__ = 'wwh'

parts = [
    'good',
    'morning',
    'hello',
    'world?'
]
#' '是连接字符串中间穿插的字符,也可以是其他任何字符
#可以针对列表,元组,字典,文件,集合或生成器
print(' '.join(parts))
#使用生成器的join相对更好,因为可以加上一些处理对每个元素,处理过程中完成连接
print(' '.join(s for s in parts))

这里写图片描述

对于简单的我们可以直接使用python的print函数(python3中print编程了函数写法为print()),功能也相应增加了

__author__ = 'wwh'


a = '1'
b = '2'
c = '3'
print(a,b,c,sep = ':', end='\n')

这里写图片描述
函数如下
这里写图片描述

注意:
对字符串的操作我们我们需要谨慎,因为如果是大量字符串的话,可能会产生性能问题,比如一个加载大量字符串到内存,会产生内存不足的情况等,此时可以使用生成器yield,含有yield的函数会被编译成生成器对象,这个对象支持迭代器接口,可以迭代的将对象加载进入内存,这样就不需要担心刚才的问题了。
含有yield关键字的函数不像一般函数执行完毕会return退出(生成器函数不允许return),生成器yield函数会在执行完毕后自动挂起暂停状态并保存暂停时的状态,以便于下次继续执行


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天的技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值