本文讲一讲与python字符串打交道时的一些注意事项,最初是参考python cookbook一书,后来更新了一部分内容。目录如下

  • 尽量使用字符串方法而不是re库
  • 正则表达式中实现“或”的逻辑(2020年9月7日更新了多字符的或逻辑)
  • 字符串拼接
  • 文件读写时
  • 配合生成器使用
  • 字符串反斜杠和正则(2020年9月7日更新新增了这一节)

1.尽量使用字符串方法而不是re库

我平常操作字符串时最常用的是join strip split +这几个方法,如果遇到这几个方法解决不了的事情就去使用re库,如字符串匹配、替换等,甚至都完全忘记字符串本身提供了非常丰富的方法。

所以这里提醒关注find replace startswith endswith这几个方法,这些基础的方法会比re库快很多,字面匹配用这些比较好,涉及到需要写正则表达式才能匹配下来的情况再找re库

2.正则表达式中实现“或”的逻辑

比如下面拆分出单词,因为分隔符不同,所以要使用“或”的逻辑

import re
line = 'am are; friend, kind,good, foolish'

当你通过“或”的逻辑写下这样的代码时

re.split(';s*|,s*| s*', line)# ['am', 'are', 'friend', 'kind', 'good', 'foolish']

要想到可以改成这样

re.split('[,; ]s*', line)# ['am', 'are', 'friend', 'kind', 'good', 'foolish']

另外,如果分隔符想保留下来,可以加一个括号

re.split('([,; ]s*)', line)# ['am', ' ', 'are', '; ', 'friend', ', ', 'kind', ',', 'good', ', ', 'foolish']

更灵活的方式是用(?:),可以实现多字符的“或”逻辑。假设分隔符不是单个字符,则[]无法使用,如下所示,假如&&也想作为一个分隔符

import re
line = 'am are; friend, kind,good, foolish&& bc'
re.split('[,; ]s*', line)
# ['am', 'are', 'friend', 'kind', 'good', 'foolish&&', 'bc']re.split('(?:;|,| |&&)s*', line)
# ['am', 'are', 'friend', 'kind', 'good', 'foolish', 'bc']

这种“或”逻辑在re.findall等其他功能中也经常使用。

3.字符串拼接

a b两个字符串用空格拼接起来一般有三种方法

a = 'abc'
b = 'bcd'' '.join((a, b))
a + ' ' + b
'{} {}'.format(a, b)# 'abc bcd'

需要注意的是

(1)不要使用这种写法

s = ''
for p in parts:s += p

使用加号来连接大量字符是非常低效率的,因为会产生大量中间变量,涉及内存复制和垃圾回收操作

可以将每次新的值append到列表中,最好是定义在函数里,每次yield出来,最后得到一个生成器,举例如下

def get_string(a):yield 'This is a'if a > 1:yield 'big'else:yield 'small'yield 'one.'' '.join(get_string(2))
# 'This is a big one.'' '.join(get_string(0))
# 'This is a small one.'

(2)避免不必要的拼接

print(a + ':' + b + ':' + c) # Ugly
print(':'.join([a, b, c])) # Still ugly
print(a, b, c, sep=':') # Better

4.文件读写时

我们是应该将字符串拼接得很大一起读进文件里呢,还是一小条一小条读进去呢?

  • 如果每一条字符串都很短,那么拼起来读会好一些
  • 如果字符串很长,拼起来会占很大内存,则分开读会好一些

5.配合生成器使用

def sample():yield 'Is'yield 'Chicago'yield 'Not'yield 'Chicago?'

上面的代码是值得推荐的。因为得到的生成器可定制性很高,想对它进行什么处理都可以,如

text = ''.join(sample())

或者

for part in sample():f.write(part)

上面那么多yield看起来很别扭,但是想想我们经常把yield放在循环里,几百几千都用了,这几个不算什么的。

6. 字符串反斜杠和正则

我们来看看下面例子dt的区别

'd'   # 'd'
'd'  # 'd'
r'd'  # 'd'
r'd' #'d''t'   # 't'
r't'  # 't'
't'  # 't'

解读一下这个结果

  • t有特殊的转移含义,在字符串中应看做一个整体
  • d应该看做两个字符,因为字符有转义功能,所以用表示反斜杠这个字符本身
  • 如果想表示t这两个字符,可以前面加r或者直接用
  • 'd'这种写法虽然也不会报错,但它不规范

在正则表达式中d表示数字,虽然有特殊含义,但它们依然是两个字符,直接'd'虽然可以正常运行,但并不规范。下面例子三种方式都能得到相同的结果,但第一种写法不规范。

import re
line = 'a1b2c'
re.split('d', line) # bad
re.split('d', line) # good
re.split(r'd', line) # good# ['a', 'b', 'c']

其实就是在写正则时加一个r的习惯。如果我们想写的pattern中既包含d又包含t,直接用r会将t理解为t,但其实这样也可以匹配到t,看下面这个例子

import re
line = 'a1b2ctd'
re.split(r'd|t', line)  # ['a', 'b', 'c', 'd']
re.split('d|t', line) # ['a', 'b', 'c', 'd']
re.split('d|t', line)  # ['a', 'b', 'c', 'd']
re.split('d|t', line)  # ['a', 'b', 'c', 'd']
re.split('d|t', line)   # ['a', 'b', 'c', 'd']import re
line = r'a1b2ctd'
re.split('d|t', line)     # ['a', 'b', 'ctd']
re.split('d|t', line)    # ['a', 'b', 'ctd']
re.split('d|t', line)  # ['a', 'b', 'c', 'd']

上面结果说明

  • 匹配t,用tt都可以
  • 匹配t,必须用t,因为是在分别匹配三个字符

同理,我们也就很好地理解下面这两个例子

import re
line = 'a1b2cdd'
re.split('d|d', line)  # ['a', 'b', 'c', 'd']line = r'a1b2cdd'
re.split('d|d', line)  # ['a', 'b', 'c', 'd']

因为'd'r'd' 都相当于'd',和上面t的情形一样。

总结规律:正则表达式匹配的是字符本身,而不是print出来的样子。

  • 比如匹配'd''t',就看做三个字符,不管它其中一个是用于转义,print出来只有一个反斜杠。
  • 比如匹配't',就看做两个字符用t,不管你print出来是否有特殊含义。而为什么t也可以呢?因为就像正则中用d匹配数字一样,正则中也用t来专门匹配t

专栏信息

专栏主页:python编程

专栏目录:目录

版本说明:软件及包版本说明

c++ 字符串拼接_python字符串零碎总结相关推荐

  1. python 字符串拼接_Python字符串拼接的6种方法(转)

    add by zhj: 对于多行字符串连接,第6种连接方法很方便,连接时不会添加额外的空格. 1. 加号 第一种,有编程经验的人,估计都知道很多语言里面是用加号连接两个字符串,Python里面也是如此 ...

  2. python字符串截取后拼接_Python字符串拼接、截断、搜索、替换,python,截取,查找

    熟练掌握字符串操作可以使我们的开发效率更高,接下来总结一下python字符串的操作 一.字符串拼接 1.字符串拼接,直接用加号即可, string1 = "Today is " s ...

  3. 2021-05-16 C#.NET面试题 说说字符串拼接、字符串内插法

    说说字符串拼接.字符串内插法 将数组中的字符串拼接成一个字符串: var parts = new[] { "Foo", "Bar", "Fizz&qu ...

  4. c++字符串拼接_Python零基础入门(三):字符串进阶

    点击蓝字 关注浅韵 一起划水 封面图: 这幅漫画告诉我们:程序不仅仅是写出来就完事的,还要看看能不能实现自己的目的,以及实现目的的方式是不是自己所希望的. 零.目标 1.字符串的增删改查2.字符串和内 ...

  5. python字符串截取拼接_Python字符串拼接、截取及替换方法总结分析

    本文实例讲述了Python字符串拼接.截取及替换方法.分享给大家供大家参考,具体如下: python字符串连接 python字符串连接有几种方法,我开始用的第一个方法效率是最低的,后来看了书以后就用了 ...

  6. python判断奇偶数字符串的拼接_Python字符串拼接方法总结

    这篇文章主要介绍了Python字符串拼接的几种方法整理的相关资料,这里提供了五种方法及实现,需要的朋友可以参考下 Python字符串拼接的几种方法整理 第一种 通过加号(+)的形式 print('第一 ...

  7. python脚本字符串拼接_Python脚本分割和连接字符串

    python脚本字符串拼接 This article gives an overview of Python Script functions to split strings and string ...

  8. python 字符串拼接_Python中拼接字符串的方法 | 萧小寒

    摘要 在编程语言中,几乎每种语言都有关于字符串的操作方法或函数.原因很简单,字符串做为编程语言中不可或缺的数据类型,有着不可以替代的重要性.不同的是,每种编程语言对于字符串的处理方式都有自己的特色.这 ...

  9. python字符串类型_python字符串类型介绍

    一. 字符串的写法 1.单引号或双引号 二. 字符串是不会变的 1.字符串不会变,只会新增后再赋值 a = 'ABC' b = a a = 'XYZ' print(b) 结果还是ABC 三. 字符串的 ...

最新文章

  1. php 开启mysql_php如何开启mysqli扩展
  2. FF小股东美国起诉恒大 要求收回中国公司控制权
  3. 什么是Microsoft Teams的App Studio
  4. CoreCLR源码探索(三) GC内存分配器的内部实现
  5. Java架构师除了必备的技术之外,这些技能也需必备?你们觉得呢?
  6. (转) Dockerfile 中的 COPY 与 ADD 命令
  7. 计算机应用基础离线考核,东师2016年秋季《计算机应用基础》期末考核离线作业...
  8. 洛谷——P1476 休息中的小呆
  9. 【Spring】bean的作用域
  10. word表格中 英文排版
  11. pycharm2018.3.3 永久激活
  12. mysql字符集和校对规则
  13. iOS 拦截系统自带的Pop事件
  14. oracle结束关闭数据,谈谈Oracle数据库的关闭
  15. #C语言-基础篇(Ⅳ)
  16. Linux内核移植笔记 | 02 - 移植Linux 3.4.2 内核到JZ2440(修改内核中的mtd分区)
  17. 前端加载高德离线地图的解决方案
  18. 矩阵分析L6矩阵函数
  19. 奔跑者阿甘:我就干活,别的顺其自然才是禅者的初心
  20. HDU4870_Rating_双号从零单排_高斯消元求期望

热门文章

  1. PTA--Pop Sequence判定
  2. oracle创建用户和角色、管理授权以及表空间操作
  3. 吴恩达深度学习笔记 3.1~3.11 浅层神经网络
  4. [转载]C#异步调用四大方法详解
  5. window对象与document对象的区别
  6. iOS 播放音频的几种方法
  7. php访问mysql 封装
  8. CentOS 7 安装OpenOffice并实现WordToPDF(Java调用)
  9. python编写图片主色转换脚本
  10. shell脚本编写保存