python3-cookbook中每个小节以问题、解决方案和讨论三个部分探讨了Python3在某类问题中的最优解决方式,或者说是探讨Python3本身的数据结构、函数、类等特性在某类问题上如何更好地使用。这本书对于加深Python3的理解和提升Python编程能力的都有显著帮助,特别是对怎么提高Python程序的性能会有很好的帮助,如果有时间的话强烈建议看一下。

本文为学习笔记,文中的内容只是根据自己的工作需要和平时使用写了书中的部分内容,并且文中的示例代码大多直接贴的原文代码,当然,代码多数都在Python3.6的环境上都验证过了的。不同领域的编程关注点也会有所不同,有兴趣的可以去看全文。

python3-cookbook:https://python3-cookbook.readthedocs.io/zh_CN/latest/index.html

 2.1 使用多个界定符分割字符串

一般字符串的分割用str.split足以胜任,但是在复杂的文本中查找分割字符串,正则表达式是无疑是首选的工具,re模块也有一个分割字符串的函数split,需要注意的是正则表达式中如果有括号分组的话,分组的结果也会在结果列表中。

  1. >>> import re
  2. >>> line = 'asdf fjdk; afed, fjek,asdf, foo'
  3. >>> re.split(r'[;,\s]\s*', line)
  4. ['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']
  5. >>> fields = re.split(r'(;|,|\s)\s*', line) # 分组的内容也会出现在结果里
  6. >>> fields
  7. ['asdf', ' ', 'fjdk', ';', 'afed', ',', 'fjek', ',', 'asdf', ',', 'foo']
  8. >>>

2.3 用Shell通配符匹配字符串

当字符串的匹配一般方法不能满足,但又不想用正则表达式那么复杂,可以考虑使用fnmatch.fnmatch或fnmatch.fnmatchcase,两者都可以使用Unix Shell中常用的通配符匹配字符串,区别在于前者使用的是操作系统的大小写敏感规则,后者则完全按照你写的内容去匹配。

  1. >>> from fnmatch import fnmatch, fnmatchcase
  2. >>> fnmatch('foo.txt', '*.txt')
  3. True
  4. >>> fnmatch('foo.txt', '?oo.txt')
  5. True
  6. >>> fnmatch('Dat45.csv', 'Dat[0-9]*')
  7. True
  8. >>>

2.13 字符串对齐

字符串对齐是字符串格式化的一部分,对于普通的左对齐,右对齐和居中对齐可以使用字符串的ljust、rjust和center方法,也可以使用内置的format函数和字符串的format方法,文中推荐使用format,因为后者在字符串的格式化功能上更加的丰富和强大。

字符串的对齐工作中似乎并不常用,但我遇到过一个使用场景,就是使用字符串表示的二进制数时,需要用0或1来将字符串补齐为8位或者16位的字符串,这时字符串的对齐功能就排上用场了。

  1. >>> text = 'Hello World'
  2. >>> text.ljust(20)
  3. 'Hello World '
  4. >>> text.rjust(20)
  5. ' Hello World'
  6. >>> text.center(20)
  7. ' Hello World '
  8. >>> text.rjust(20, '=')
  9. '=========Hello World'
  10. >>> text.center(20, '*')
  11. '****Hello World*****'
  12. >>>
  1. >>> # 格式化字符串
  2. >>> format(text, '>20')
  3. ' Hello World'
  4. >>> format(text, '<20')
  5. 'Hello World '
  6. >>> format(text, '^20')
  7. ' Hello World '
  8. >>> format(text, '=<20s')
  9. 'Hello World========='
  10. >>> format(text, '*^20s')
  11. '****Hello World*****'
  12. >>> # 格式化数字
  13. >>> x = 1.2345
  14. >>> format(x, '^10.2f')
  15. ' 1.23 '
  16. >>> # 字符串的format方法
  17. >>> '{:>10s} {:>10s}'.format('Hello', 'World')
  18. ' Hello World'

2.16 以指定列宽格式化字符串

这个问题在打印信息或者在终端展示信息的时候可能会遇到,此时可以使用textwrap来指定输出列宽。

  1. >>> import textwrap
  2. >>> s = "Look into my eyes, look into my eyes, the eyes, the eyes, the eyes, not around the eyes, don't look around the eyes, look into my eyes, you're under."
  3. >>> print(textwrap.fill(s, 70))
  4. Look into my eyes, look into my eyes, the eyes, the eyes, the eyes,
  5. not around the eyes, don't look around the eyes, look into my eyes,
  6. you're under.
  7. >>> print(textwrap.fill(s, 40))
  8. Look into my eyes, look into my eyes,
  9. the eyes, the eyes, the eyes, not around
  10. the eyes, don't look around the eyes,
  11. look into my eyes, you're under.
  12. >>> print(textwrap.fill(s, 40, initial_indent=' '))
  13. Look into my eyes, look into my
  14. eyes, the eyes, the eyes, the eyes, not
  15. around the eyes, don't look around the
  16. eyes, look into my eyes, you're under.
  17. >>> print(textwrap.fill(s, 40, subsequent_indent=' '))
  18. Look into my eyes, look into my eyes,
  19. the eyes, the eyes, the eyes, not
  20. around the eyes, don't look around
  21. the eyes, look into my eyes, you're
  22. under.
  23. >>>

2.17 在字符串中处理html和xml

在处理HTML或XML文本的时候,想要将如&entity;或&#code;替换为对应的文本,或者反过来操作,只需要使用对应解析器的工具函数即可,当然,如果你比较熟悉对应的解析器的话或许有更好的方法。

  1. >>> import html
  2. >>> s = 'Elements are written as "<tag>text</tag>".'
  3. >>> print(s)
  4. Elements are written as "<tag>text</tag>".
  5. >>> print(html.escape(s))
  6. Elements are written as &quot;&lt;tag&gt;text&lt;/tag&gt;&quot;.
  7. >>> print(html.escape(s, quote=False))
  8. Elements are written as "&lt;tag&gt;text&lt;/tag&gt;".
  9. >>>
  10. >>> from html.parser import HTMLParser
  11. >>> s = 'Spicy &quot;Jalapeño&quot.'
  12. >>> p = HTMLParser()
  13. >>> p.unescape(s)
  14. 'Spicy "Jalapeño".'
  15. >>>
  16. >>> from xml.sax.saxutils import unescape
  17. >>> t = 'The prompt is &gt;&gt;&gt;'
  18. >>> unescape(t)
  19. 'The prompt is >>>'
  20. >>>

2.18 字符串令牌解析

令牌化字符串可以使用正则表达式的命名捕获分组来进行,语法为“(?P<group_name>)”,这个问题在解析用户自定义的计算公式字符串时会很有用。

解决这个问题时,可以考虑使用模式对象的scanner方法,并打包到一个生成器中使用。

  1. import re
  2.  
  3. NAME = r'(?P<NAME>[a-zA-Z_][a-zA-Z_0-9]*)'
  4. NUM = r'(?P<NUM>\d+)'
  5. PLUS = r'(?P<PLUS>\+)'
  6. TIMES = r'(?P<TIMES>\*)'
  7. EQ = r'(?P<EQ>=)'
  8. WS = r'(?P<WS>\s+)'
  9.  
  10. master_pat = re.compile('|'.join([NAME, NUM, PLUS, TIMES, EQ, WS]))
  11. scanner = master_pat.scanner('foo = 42')
  12. for m in iter(scanner.match, None):
  13. print(m.lastgroup, m.group())
  1. NAME foo
  2. WS
  3. EQ =
  4. WS
  5. NUM 42

python3-cookbook笔记:第二章 字符串和文本的更多相关文章

  1. 《DOM Scripting》学习笔记-——第二章 js语法

    <Dom Scripting>学习笔记 第二章 Javascript语法 本章内容: 1.语句. 2.变量和数组. 3.运算符. 4.条件语句和循环语句. 5.函数和对象. 语句(stat ...

  2. The Road to learn React书籍学习笔记(第二章)

    The Road to learn React书籍学习笔记(第二章) 组件的内部状态 组件的内部状态也称为局部状态,允许保存.修改和删除在组件内部的属性,使用ES6类组件可以在构造函数中初始化组件的状 ...

  3. [HeadFrist-HTMLCSS学习笔记]第二章深入了解超文本:认识HTML中的“HT”

    [HeadFrist-HTMLCSS学习笔记]第二章深入了解超文本:认识HTML中的"HT" 敲黑板!!! 创建HTML超链接 <a>链接文本(此处会有下划线,可以单击 ...

  4. Android群英传笔记——第二章:Android开发工具新接触

    Android群英传笔记--第二章:Android开发工具新接触 其实这一章并没什么可讲的,前面的安装Android studio的我们可以直接跳过,如果有兴趣的,可以去看看Google主推-Andr ...

  5. 深入理解 C 指针阅读笔记 -- 第二章

    Chapter2.h #ifndef __CHAPTER_2_ #define __CHAPTER_2_ /*<深入理解C指针>学习笔记 -- 第二章*/ /* 内存泄露的两种形式 1.忘 ...

  6. 《SQL CookBook 》笔记-第二章-查询结果排序

    目录 第二章 查询结果排序 2.1 以指定顺序返回查询结果 2.2 依据子串排序 2.3 排序时对 Null 值的处理 2.4 依据条件逻辑动态调整排序项 第二章 shanzm 第二章 查询结果排序 ...

  7. c#高级编程第七版 学习笔记 第二章 核心c#

    第二章 核心C# 本章内容: 声明变量 变量的初始化和作用域 C#的预定义数据类型 在c#程序中使用条件语句.循环和跳转语句执行流 枚举 名称空间 Main()方法 基本的命令行c#编译器选项 使用S ...

  8. 《图解HTTP》阅读笔记--第二章 简单的HTTP协议--第三章 HTTP报文信息

     第二章.简单的HTTP协议HTTP协议:HTTP协议用于客户端(请求资源的一端)和服务器端(响应回复提供资源的一端)的通信,是一种无状态协议HTTP1.1默认TCP持久连接,管线化发送(并行发送多个 ...

  9. STL源码分析读书笔记--第二章--空间配置器(allocator)

    声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的 ...

随机推荐

  1. 使用ClouderaManager管理的HBase的RegionServer无法启动(启动失败)的问题

    问题概述 "新冠期间"远程办公,需要重新搭建一套ClouderaManager(CM)开发环境,一位测试同事发现HBase的RegionServer无法启动,在CM界面上启动总是失 ...

  2. 利用Python进行TCP、UDP套接字编程

    参考:http://www.cnblogs.com/whatbeg/p/5155524.html http://www.cnblogs.com/nzyjlr/p/4236287.html

  3. Codeforces Global Round 3(A-D)

    我凉了..感觉自己啥都不会做,搞不好起床就绿了啊 代码和反思起床补,今天要反了个大思的 A. Another One Bites The Dust 把所有的ab排在一起然后两边叉a和b #includ ...

  4. centos7 手把手从零搭建深度学习环境 (以TensorFlow2.0为例)

    目录 一. 搭建一套自己的深度学习平台 二. 安装系统 三. 安装NVIDA组件 四. 安装深度学习框架 TensorFlow 五. 配置远程访问 六. 验收 七. 福利(救命稻草

  5. MySQL中遍历查询结果的常用API(c)

    本中所使用的table: MySQL中的错误处理函数 unsigned int mysql_errno(MYSQL *mysql) const char *mysql_error(MYSQL *mys ...

  6. 在CentOS8 上安装Python3

    从centos开始入手学习linux.感觉安装python很费劲,之前centos6因为python2和python3兼容的问题一直无法彻底解决,python3一旦安装影响到python2,cento ...

  7. k8s系列---yaml文件格式

    https://www.bejson.com/validators/yaml_editor/ yaml文件大致格式解析,通过上面这个解析网站,可以看到yaml文件解析的格式长什么样,如果知道字典和列表 ...

  8. [CentOS7]sed 指定字符前后添加内容

    指定字符前面添加 sed -i 's/指定的字符/需要添加的字符&/' 文件名称 修改Linux启动配置 将 GRUB_CMDLINE_LINUX="rd.lvm.lv=centos ...

  9. 注销Apache

    到D:\phpTools\Apache24\bin下运行cmd 输入httpd.exe -k uninstall -n apache24 回车后提示注销完成 接着把Apache的文件删了即可

  10. [LeetCode] [链表] 相关题目总结

    刷完了LeetCode链表相关的经典题目,总结一下用到的技巧: 技巧 哑节点--哑节点可以将很多特殊case(比如:NULL或者单节点问题)转化为一般case进行统一处理,这样代码实现更加简洁,优雅 ...