c++ 字符串拼接_python字符串零碎总结
本文讲一讲与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. 字符串反斜杠和正则
我们来看看下面例子d
和t
的区别
'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
,用t
或t
都可以 - 匹配
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字符串零碎总结相关推荐
- python 字符串拼接_Python字符串拼接的6种方法(转)
add by zhj: 对于多行字符串连接,第6种连接方法很方便,连接时不会添加额外的空格. 1. 加号 第一种,有编程经验的人,估计都知道很多语言里面是用加号连接两个字符串,Python里面也是如此 ...
- python字符串截取后拼接_Python字符串拼接、截断、搜索、替换,python,截取,查找
熟练掌握字符串操作可以使我们的开发效率更高,接下来总结一下python字符串的操作 一.字符串拼接 1.字符串拼接,直接用加号即可, string1 = "Today is " s ...
- 2021-05-16 C#.NET面试题 说说字符串拼接、字符串内插法
说说字符串拼接.字符串内插法 将数组中的字符串拼接成一个字符串: var parts = new[] { "Foo", "Bar", "Fizz&qu ...
- c++字符串拼接_Python零基础入门(三):字符串进阶
点击蓝字 关注浅韵 一起划水 封面图: 这幅漫画告诉我们:程序不仅仅是写出来就完事的,还要看看能不能实现自己的目的,以及实现目的的方式是不是自己所希望的. 零.目标 1.字符串的增删改查2.字符串和内 ...
- python字符串截取拼接_Python字符串拼接、截取及替换方法总结分析
本文实例讲述了Python字符串拼接.截取及替换方法.分享给大家供大家参考,具体如下: python字符串连接 python字符串连接有几种方法,我开始用的第一个方法效率是最低的,后来看了书以后就用了 ...
- python判断奇偶数字符串的拼接_Python字符串拼接方法总结
这篇文章主要介绍了Python字符串拼接的几种方法整理的相关资料,这里提供了五种方法及实现,需要的朋友可以参考下 Python字符串拼接的几种方法整理 第一种 通过加号(+)的形式 print('第一 ...
- python脚本字符串拼接_Python脚本分割和连接字符串
python脚本字符串拼接 This article gives an overview of Python Script functions to split strings and string ...
- python 字符串拼接_Python中拼接字符串的方法 | 萧小寒
摘要 在编程语言中,几乎每种语言都有关于字符串的操作方法或函数.原因很简单,字符串做为编程语言中不可或缺的数据类型,有着不可以替代的重要性.不同的是,每种编程语言对于字符串的处理方式都有自己的特色.这 ...
- python字符串类型_python字符串类型介绍
一. 字符串的写法 1.单引号或双引号 二. 字符串是不会变的 1.字符串不会变,只会新增后再赋值 a = 'ABC' b = a a = 'XYZ' print(b) 结果还是ABC 三. 字符串的 ...
最新文章
- php 开启mysql_php如何开启mysqli扩展
- FF小股东美国起诉恒大 要求收回中国公司控制权
- 什么是Microsoft Teams的App Studio
- CoreCLR源码探索(三) GC内存分配器的内部实现
- Java架构师除了必备的技术之外,这些技能也需必备?你们觉得呢?
- (转) Dockerfile 中的 COPY 与 ADD 命令
- 计算机应用基础离线考核,东师2016年秋季《计算机应用基础》期末考核离线作业...
- 洛谷——P1476 休息中的小呆
- 【Spring】bean的作用域
- word表格中 英文排版
- pycharm2018.3.3 永久激活
- mysql字符集和校对规则
- iOS 拦截系统自带的Pop事件
- oracle结束关闭数据,谈谈Oracle数据库的关闭
- #C语言-基础篇(Ⅳ)
- Linux内核移植笔记 | 02 - 移植Linux 3.4.2 内核到JZ2440(修改内核中的mtd分区)
- 前端加载高德离线地图的解决方案
- 矩阵分析L6矩阵函数
- 奔跑者阿甘:我就干活,别的顺其自然才是禅者的初心
- HDU4870_Rating_双号从零单排_高斯消元求期望