欢迎关注我的微信公众号 AlwaysBeta,更多精彩内容等你来。

以下测试代码全部基于 Python3。

字符串操作在程序中的出现频率相当高,包括分割,替换,拼接等等,这篇文章介绍五个最常遇到的问题,希望给你带来一些思考。

1、使用多个界定符分割字符串

分割字符串属于字符串最基本的操作了,直接用 split() 即可。

In [88]: a = 'a,b,c,c'In [89]: a.split(',')
Out[89]: ['a', 'b', 'c', 'c']

如果一个字符串包含多个不同的分隔符呢?当然可以用 split() 进行多次分割,但这显然比较麻烦,这时候用 re.split() 是更好的解决办法。

In [90]: a = 'a,b c:d,e'In [91]: import reIn [92]: re.split(r'[,| |:]', a)
Out[92]: ['a', 'b', 'c', 'd', 'e']

re.split() 函数的第一个参数可以根据你的需要,写出符合要求的正则表达式。

2、字符串开头或结尾匹配

解决这个问题可以有很多种方法。

第一可以使用切片操作,截取出字符串和要求字符串进行比较;第二可以使用 re.march() 函数,通过写正则表达式,检查匹配结果来达到比较目的。

这里介绍两个更简单的函数 startswith() 和 endswith()。

In [93]: a = 'hello.py'In [94]: a.endswith('.py')
Out[94]: TrueIn [95]: a.startswith('h')
Out[95]: True

需要注意的是,如果要一次比较多个字符串,所传入的参数必须是元组,否则会报错。

In [96]: names = ['a.txt', 'b.py', 'c', 'd.py']In [97]: [name for name in names if name.endswith('.py')]
Out[97]: ['b.py', 'd.py']In [98]: [name for name in names if name.endswith('.py', '.txt')]
-----------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-98-900fc5940b5c> in <module>()
> 1 [name for name in names if name.endswith('.py', '.txt')]<ipython-input-98-900fc5940b5c> in <listcomp>(.0)
> 1 [name for name in names if name.endswith('.py', '.txt')]TypeError: slice indices must be integers or None or have an __index__ methodIn [99]: [name for name in names if name.endswith(('.py', '.txt'))]
Out[99]: ['a.txt', 'b.py', 'd.py']

再来看另一种情况,我们用 Linux 系统 shell 命令时,很喜欢用通配符,比如 ls *.py 来查看文件夹下所有 Python 文件。

在程序中也有两个函数,fnmatch() 和 fnmatchcase() 来支持这种通配符的操作方式。

In [100]: from fnmatch import fnmatch, fnmatchcaseIn [101]: fnmatch('a.py', '*.py')
Out[101]: True

由于不同的操作系统,对于模式大小写匹配规则是不一样的,所以 fnmatchcase() 函数的作用就是完全按照模式大小写来匹配。

3、字符串搜索和替换

对于简单的模式,直接使用 replace() 函数即可。

In [102]: a = 'hello world'In [103]: a.replace('hello', 'go')
Out[103]: 'go world'

如果是复杂的模式,可以使用 re.sub() 函数。比如你想把 ’11/30/2017’ 转换成 ’2017-11-30‘。

In [104]: a = 'time is 11/30/2017'In [106]: re.sub(r'(d+)/(d+)/(d+)', r'3-1-2', a)
Out[106]: 'time is 2017-11-30'

sub() 函数第一个参数表示原字符串匹配模式,第二个参数是希望转换成的模式,反斜杠 3 为前面获取的组号。

其实这种解决方法归根结底还是考验对正则表达式理解程度,如果对正则表达式很熟悉的话,解决这类问题会很轻松。

我刚开始工作时用的语言是 Perl,这个语言对文本处理相当强悍,用的最多的就是正则表达式,写起来也很方便,当时写过很多很复杂的正则。后来开始写 Python 之后,感觉写正则好麻烦,很不习惯。

4、最短匹配和多行匹配模式

这两个操作所要注意的就两个方面。

第一,当使用 .* 进行匹配时,所采用的模式为贪婪匹配,如果想要结果为最短匹配,需要写成非贪婪匹配:.*?

第二,点号是不能匹配换行符的,所以在进行多行匹配时,要写成:[.|n]

5、字符串格式换

首先说说字符串拼接,如果简单拼接两个字符串,加号便可以轻松搞定。

In [110]: a = 'hello'In [111]: b = 'world'In [112]: a + ' ' + b
Out[112]: 'hello world'

如果拼接一个列表中的字符串呢?可以用 join() 函数。

In [113]: a = ['I', 'have', 'a', 'dream']In [114]: ' '.join(a)
Out[114]: 'I have a dream'

再来看看这类替换操作:

In [115]: a = '{name} is {age}'In [116]: a.format(name='Tom', age=18)
Out[116]: 'Tom is 18'

其实 format() 函数还有很多功能,比如打印的时候就常用它来格式化,有兴趣可以进行更多了解。

未完待续。。。

shell split分割字符串_Python3 CookBook | 字符串和文本相关推荐

  1. python删除字符串_Python3 - 删除字符串中不需要的字符

    问题 去掉文本字符串开头,结尾或者中间不想要的字符,比如空白. 解决方案 strip() 方法用于删除字符串开始或结尾的字符. lstrip() 和 rstrip() 分别从左和从右执行删除操作. 默 ...

  2. sqlserver中实现split分割字符串函数

    常用的. IF OBJECT_ID (N'fn_split') IS NOT NULL DROP FUNCTION  fn_split go CREATE  function dbo.fn_split ...

  3. SQL实现split函数,自定义分割字符,自定义取出第几个分割字符前的字符串

    自定义取出第几个分割字符前的字符串,默认位置(0) 格式:dbo.split(字段名,'分隔字符',取出的第几个字符串) 如果没有分隔的字符,则返回整个字符串. 如果取出的位置字符串的位置超出Inde ...

  4. PLSQL Split分割字符串

    系统自带的split,使用起来方便,但是如果字符串太长,可能会出现异常,这里,我自己写了一个也是该名字,放在自己的包中,引用的时候带包名就好了. --系统自带的函数 /*CURSOR cur_temp ...

  5. python复制指定字符串_python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)...

    python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...

  6. split()分割字符串数组

    用于把一个字符串分割成字符串数组. <!DOCTYPE html> <html><head><meta charset="utf-8"&g ...

  7. Shell脚本分割字符串

    Shell脚本分割字符串 以字符进行切割时: 从字符串左边开始计数 如果想从字符串的左边开始计数,那么截取字符串的具体格式如下: ${string: start :length} 其中,string ...

  8. oracle split 分割字符串,Oracle字符串分割Split

    Oracle字符串分割Split 一.创建数组类型 Sql代码 CREATE OR REPLACE TYPE T_RET_TABLE IS TABLE OF VARCHAR2(512) 二.创建字符串 ...

  9. java split 分割字符串_字符串分割--java中String.split()用法

    在java.lang包中有String.split()方法,返回是一个数组. 一. "."和"|"都是转义字符,必须得加"\\"; 若是用& ...

最新文章

  1. 新站长更要努力做好SEO相关的优化
  2. SoundPool 音频播放 详解 示例
  3. python不能加密_Python之加密模块
  4. 免费Apk盈利之路:嵌入AdMob广告
  5. jQuery(function(){...})与(function($){...})(jQuery)的“兄弟”情结
  6. 猪八戒背媳妇用计算机弹出来,猪八戒背媳妇?杭城游泳馆爆笑一幕:浙大学霸果然机智!...
  7. 大学生代跑全新简洁界面单页官网
  8. 64位双系统Ubuntu 14.04 LTS + Caffe + CUDA 7.5 + Opencv 3.0 安装配置实战
  9. BZOJ 4269: 再见Xor [高斯消元 线性基]
  10. Redis数据库的初步认识(二)-C/C++连接redis数据库
  11. docker基础4--docker的命令
  12. Windows批量装机平台搭建(三)之MDT配置
  13. AT89C51单片机万年历仿真图+代码
  14. 智能化系统工程施工阶段划分
  15. apt安装包时报错:Certificate verification failed: The certificate is NOT trusted.
  16. android fragmentmanager 界面报错,FragmentManager is already executing transactions异常
  17. 小牛性能服务器图片,小牛8玩游戏卡不卡? 实测后发现真不差
  18. SpringBoot 存储图片 tomcat服务器存图片 数据库图片路径
  19. STC单片机看门狗验证程序
  20. 基于mean-shift的简单目标跟踪

热门文章

  1. iTOP-4412开发板网盘资料介绍
  2. 使用django创建一个简单的APP应用
  3. win7+bugzilla+apache+mysql+activePerl环境安装bugzilla
  4. 日常办公耗材管理解决方案
  5. 赛门铁克警告Switch模拟器下载链接实为垃圾站点
  6. 学习Sql语法,看这一篇就够了!速成宝典,看完必懂!
  7. Alpha测试和Beta测试:定义和区别
  8. Sortable.js快速上手
  9. AI绘画人像promt分享
  10. 22届硕士,去年秋招拿了字节跳动offer,有一说一,不是很难进