Skip to content

第二章:字符串和文本

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

问题

将一个字符串分割为多个字段,但是分隔符(还有周围的空格)并不是固定的。

  • re.split()
解决方案

string 对象的 split() 方法只适应于非常简单的字符串分割情形, 它并不允许有多个分隔符或者是分隔符周围不确定的空格。 当需要更加灵活的切割字符串的时候,最好使用 re.split() 方法

>>> line = 'asdf fjdk; afed, fjek,asdf, foo'
>>> import re
>>> re.split(r'[;,\s]\s*', line) # 分隔符可以是逗号,分号或者是空格,并且后面紧跟着任意个的空格。 
['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo'] # 返回结果为一个字段列表,这个跟 str.split() 返回值类型是一样的。
讨论

Attention

当你使用 re.split() 函数时候,需要特别注意的是正则表达式中是否包含一个括号捕获分组。如果使用了捕获分组,那么被匹配的文本也将出现在结果列表中。

>>> fields = re.split(r'(;|,|\s)\s*', line)
>>> fields
['asdf', ' ', 'fjdk', ';', 'afed', ',', 'fjek', ',', 'asdf', ',', 'foo']
>>>

如果想保留分割字符串,用来在后面重新构造一个新的输出字符串,可以如下操作:

>>> values = fields[::2]
>>> delimiters = fields[1::2] + ['']
>>> values
['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']
>>> delimiters
[' ', ';', ',', ',', ',', '']
>>> # Reform the line using the same delimiters
>>> ''.join(v+d for v,d in zip(values, delimiters))
'asdf fjdk;afed,fjek,asdf,foo'
>>>

如果不想保留分割字符串到结果列表中去,但仍然需要使用到括号来分组正则表达式的话, 确保你的分组是非捕获分组,形如 (?:...) 。比如:

>>> re.split(r'(?:,|;|\s)\s*', line)
['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']
>>>

02 字符串开头或结尾匹配

问题

解决方案


讨论


03 用Shell通配符匹配字符串

问题

解决方案


讨论


04 字符串匹配和搜索

问题

解决方案


讨论


05 字符串搜索和替换

问题

解决方案


讨论


06 字符串忽略大小写的搜索替换

问题

解决方案


讨论


07 最短匹配模式

问题

解决方案


讨论


08 多行匹配模式

问题

解决方案


讨论


09 将Unicode文本标准化

问题

解决方案


讨论


10 在正则式中使用Unicode

问题

解决方案


讨论


11 删除字符串中不需要的字符

问题

解决方案


讨论


12 审查清理文本字符串

问题

解决方案


讨论


13 字符串对齐

问题

解决方案


讨论


14 合并拼接字符串

问题

解决方案


讨论


15 字符串中插入变量

问题

解决方案


讨论


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

问题

解决方案


讨论


17 在字符串中处理html和xml

问题

解决方案


讨论


18 字符串令牌解析

问题

解决方案


讨论


19 实现一个简单的递归下降分析器

问题

解决方案


讨论


20 字节字符串上的字符串操作

问题

解决方案


讨论


总结

总结