python字符串与文本处理技巧(4): 格式化输出、令牌解析、串上串
1. 以指定列宽格式化字符串
很多情况下,我们有一些长字符串,想以指定的列宽将它们重新格式化。
- textwarp()
import textwrap
import oss = "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."
length = 50 # os.get_terminal_size().columns;
print(textwrap.fill(s, length))
# >>> 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.print(textwrap.fill(s, length, initial_indent = ' '))
# >>> 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.print(textwrap.fill(s, length, subsequent_indent=' '))
# >>> 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.
textwrap 模块对于字符串打印是非常有用的,特别是输出自动匹配终端大小的时候。 可以使用 os.get_terminal_size() 方法来获取终端的大小尺寸
2. 字符串令牌解析
当有一个字符串,我们需要从左至右将其解析为一个令牌流。
为了令牌化字符串,我们不仅需要匹配模式,还得指定模式的类型。 比如,可能想将字符串转换为序列对。
为了执行序列对的切分,第一步就是利用命名捕获组的正则表达式来定义所有可能的令牌,包括空格。
import retext = 'foo = 23 + 42 * 10'
NAME = r'(?P<NAME>[a-zA-Z_][a-zA-Z_0-9]*)'
NUM = r'(?P<NUM>\d+)'
PLUS = r'(?P<PLUS>\+)'
TIMES = r'(?P<TIMES>\*)'
EQ = r'(?P<EQ>=)'
WS = r'(?P<WS>\s+)'
master_pat = re.compile('|'.join([NAME, NUM, PLUS, TIMES, EQ, WS]))
scanner = master_pat.scanner(text)
res = scanner.match()
print( res.lastgroup, res.group())
# >>> NAME foo
在上面的模式中, ?P<TOKENNAME> 用于给一个模式命名,供后面使用。
为了令牌化,使用模式对象 scanner() 方法。 这个方法会创建一个 scanner 对象, 在这个对象上不断的调用 match() 方法会一步步的扫描目标文本,每步一个匹配。
实际使用这种技术的时候,可以很容易将上述代码打包到一个生成器中。
3. 字节字符串上的字符串操作
如果想在字节字符串上执行文本操作(比如移除,搜索和替换)?字节字符串同样也支持大部分和文本字符串一样的内置操作。
data = b'Hello World'
print( data[0:5] )
# >>> b'Hello'
print( data.startswith(b'Hello') )
# >>> True
print( data.split() )
# >>> [b'Hello', b'World']
print( data.replace(b'Hello', b'Hello Cruel') )
# >>> b'Hello Cruel World'
这些操作同样也适用于字节数组。比如:
data = bytearray(b'Hello World')
print( data[0:5] )
# >>> bytearray(b'Hello')
print( data.startswith(b'Hello') )
# >>> True
print( data.split() )
# >>> [bytearray(b'Hello'), bytearray(b'World')]
print( data.replace(b'Hello', b'Hello Cruel') )
# >>> bytearray(b'Hello Cruel World')
如果我们使用正则表达式匹配字节字符串,但是正则表达式本身必须也是字节串。比如:
data = b'FOO:BAR,SPAM'
import re
## print ( re.split('[:,]',data) )
# >>> Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# File "ByteString.py", line 3, in split
# return _compile(pattern, flags).split(string, maxsplit)
# TypeError: can't use a string pattern on a bytes-like object
print( re.split(b'[:,]',data) )# Notice: pattern as bytes
# >>> [b'FOO', b'BAR', b'SPAM']
文章参考《python3-codebook》
python字符串与文本处理技巧(4): 格式化输出、令牌解析、串上串相关推荐
- python字符串与文本处理技巧(3):字符剔除、字符对齐、字符拼接、字符插入变量
1. 删除字符串中不需要的字符 去掉文本字符串开头,结尾或者中间不想要的字符,比如空白. strip() & Istrip() & rstrip() strip() 方法能用于删除开始 ...
- python字符串与文本处理技巧(2):大小写敏感搜索、最短匹配、多行匹配、Unicode标准化
1. 字符串忽略大小写的搜索替换 re.findall(patter, string, flags=re.IGNORECASE) 当我们需要忽略字符串中的字母大小写进行模式搜索时可以采用如下方案: i ...
- python字符串与文本处理技巧(1):分割、首尾匹配、模式搜索、匹配替换
1. 字符串分割 将一个字符串分割为多个字段,但是分隔符(还有周围的空格)并不是固定的. str.split() 和 re.split() string 对象的 split() 方法只适应于非常简单的 ...
- python format和百分号的区别_python 格式化输出百分号的方法
python 格式化输出百分号的方法 python的百分号输出比较奇怪,代码如下 print('%s%%'%(5))#这样就能输出'5%' 以上这篇python 格式化输出百分号的方法就是小编分享给大 ...
- # Python 字符串数据(二进制编码数据)格式转换及解析
Python 字符串数据(二进制编码数据)格式转换及解析 最近在linux上部署python,希望可以用python来调用串口,同时可以实现数据的格式转换. 在python这个做格式化转换不熟悉,花了 ...
- python字符串与文本处理教程
每个程序都回涉及到文本处理,如拆分字符串.搜索.替换.词法分析等.许多任务都可以通过内建的字符串方法来轻松解决,但更复杂的操作就需要正则表达式来解决. 1.针对任意多的分隔符拆分字符串 In [1]: ...
- python基础语法手册format-Python基础语法-格式化输出
Python基础语法 python格式化输出 python在格式化输出过程中,就我个人学习历程来看,有两种格式化输出方法. 第一种是利用 % s %d 进行占位输出,效果就是这样的: info='li ...
- python基础语法手册format-python基础_格式化输出(%用法和format用法)
Python中应该使用%还是format来格式化字符串? Python新版本推荐使用format. Python2.6 新加入的format语法支持. 3.6加入了一个 f-strings新特性 1. ...
- python语言format用法_python基础_格式化输出(%用法和format用法)
目录 %用法 1.整数的输出 %o -- oct 八进制 %d -- dec 十进制 %x -- hex 十六进制 >>> print('%o' % 20)24 >>&g ...
最新文章
- 杭电2855 Fibonacci Check-up
- 谈谈Silverlight 2中的视觉状态管理 Part1
- Android Studio快捷键之代码提示
- 硬盘突然提示没有初始化_测试流程_507283-001 硬盘 HP SAS
- 中职计算机组成原理期末,计组期末复习
- Flume将A服务器上的日志实时采集到B服务器
- JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·简单工厂——区分“变与不变”
- The finally block does not always execute in try finally
- asp.net生成高质量缩略图通用函数
- 爱奇艺CEO龚宇呼吁网络电影涨价:6块钱太低了
- OpenCV-图像饱和度
- 关于nagios监控系统添加主机和服务脚本
- Mac电脑怎样添加打印机?
- qt 合并单元格 tablewidget 合并单元格
- firebug lite for chrome
- easyui数据表格批量删除(datagrid 的deleteRow方法)
- 分享一道用Python基础+蒙特卡洛算法实现排列组合的题目(附源码)
- 年末了,是该总结一波了,冲鸭2021
- 分别输入5名同学的三门课程成绩,用函数实现每名学生的平均分。
- Spring Cloud Stream报错:Invalid bean definition with name:bean definition with this name already exist
热门文章
- Linux电源管理(5)_Hibernate和Sleep功能介绍【转】
- git学习------gt;写给 Git 初学者的7个建议
- javascript12-object04-毕包
- 爱上MVC3系列~同步与异步提交,在过滤器里如何进行重定向~续
- String 常量池
- 让Visual Studio 2005 Team Foundation Server支持Wss3
- [转] 有什么郁闷的就看看这驴!
- 数字三角形问题 (动态规划初步)
- hihocoder #1362 : 修补木桶(二分+dp)
- hdu 1546(最短路)