Displaying posts tagged with

“re”

Python食谱-1.18.一次性替换字符串中的多个子串

原文作者:Xavier Defrang, Alex Martelli 中文翻译:Tony (digitalsatori) 问题 如何对一个字符串执行多个子串替换 解决方法 虽然用正则表达式来解决字符串替换的问题有时并不那么显而易见,但它们往往是最为便捷的方法。 re 对象(来自标准库中的 re 模块)强大的 sub 方法,使正则表达式在处理字符串替换时能得心应手。以下的函数返回一个新的字符串,该字符串将输入字符串中与字典的索引键匹配的子串替换为对应的字典值。 import re def multiple_replace(text, adict): rx = re.compile('|'.join(map(re.escape, adict))) def one_xlat(match): return adict[match.group(0)] return rx.sub(one_xlat, text) 讨论 本配方展示了如何通过Python标准库中的 re 模块来实现利用字典对一个字符串一次性执行多个子串替换的方法。在本例中,有一个基于字典的字符串映射规则。字典的索引键是希望被替换的字符串,对应的键值是用来替换的字符串。通常我们可以调用字符串对象的 replace 方法对字典中的每一对'键/值'执行替换操作,每一次的替换操作实际上都会创建一个新的字符串。如果能一次性的做所有的替换操作毫无疑问会更加理想,速度也会更快,因为这样的操作只创建一个新的字符串。 re.sub 的调用回调函数的用法使这种设想能轻松实现。 首先,我们为需要匹配并最终被替换的一系列的索引键创建一个正则表达式。这个正则表达式具有 a1|a2|...|aN 这种模式,它们是由N个将要被替换的字串用竖线连接组成,在配方中用一行代码生成。然后,我们给 re.sub 传递一个回调函数作为参数(而不是传递一个替换字符串)。 re.sub 会在每次匹配时调用这个函数,并将 re.MatchObject 实例作为该函数的参数。这个函数返回的值将作为 re.sub 匹配对象的替换字符串。在本例中回调函数在字典中搜索匹配字串,并将对应的值返回。 本配方中的 multiple_replace 函数会在每次调用它时重新计算正则表达式,重新定义 one_xlat [...]

Python食谱-1.15.制表符(Tab)的扩展和收缩

原文作者:Alex Martelli, David Ascher 中文编译:Tony (digitalsatori) 问题 如何将字符串中的制表符(Tab)转换为一定数量的空格,或者反之。 解决方法 将制表符转换为几个空格是经常会碰到的工作,我们可以用Python字符串对象的 expandtabs 方法来轻松完成。因为字符串是‘不可变的’(immutable),这个方法实际上返回一个新的字符串,该字符串是原字符串的修改副本。我们可以将与原字符串绑定的变量重新绑定到新得到的字符串上: mystring = mystring.expandtabs() 以上代码并不改变mystring原本所指定的字符串,而是将mystring重新绑定到了一个 expandtabs 方法返回的新字符串,该新字符串扩展了所有原字符串中的制表符为指定数量的空格。默认情况下,制表符的宽度为8; 你也可以传递一个整数参数给expandtabs来自定义制表符的宽度。 将空格转变为tabs的情况是比较少见的,通常这种情况被称为,Tab的收缩。Python并没有提供一个内置的 unexpand 来处理将空格转换为Tab的任务。但是,我们可以自己写一个函数来完成该任务。对于字符串处理,采用‘分割-处理-再连接‘的方法远比在整个字符串上重复的做转换操作来得快捷: def unexpand(astring, tablen=8): import re # split into alternating space and non-space sequences pieces = re.split(r'( +)', astring.expandtabs(tablen)) # keep track of the total length of the string so far lensofar = 0 [...]