因
为逆向引用的语法,象 (...)\1 这样的表达式所引用的是组号,它与用组名代替组号有本质的差别。这也是一个 Python 扩展:
(?P=name) ,它表示名为name 的组的内容应该再次在当前位置被发现。为发现成对单词的正则表达式(\b\w+)\s+\1 也可以被写
成 (?P\b\w+)\s+(?P=word): >>> p = re.compile(r'(?P\b\w+)\s+(?P=word)') >>> p.search('Paris in the the spring').group() 'the the'
你可以通过设置 maxsplit 值来限制分片数。当 maxsplit 非零时,最多只能做 maxsplit 个分片,字符串的其余部分被做为列表的最后部分返回。在下面的例子中,定界符是任意的非字母数字字符的序列。
>>> p = re.compile(r'\W+') >>> p.split('This is a test, short and sweet, of split().') ['This', 'is', 'a', 'test', 'short', 'and', 'sweet', 'of', 'split', ''] >>> p.split('This is a test, short and sweet, of split().', 3) ['This', 'is', 'a', 'test, short and sweet, of split().']
有时,你不仅对定界符之间的文本感兴趣,也需要知道定界符是什么。如果捕获括号在 RE 中使用,那么定界符的值也会当作列表的一部分返回。比较下面的调用:
>>> p = re.compile(r'\W+') >>> p2 = re.compile(r'(\W+)') >>> p.split('This... is a test.') ['This', 'is', 'a', 'test', ''] >>> p2.split('This... is a test.') ['This', '... ', 'is', ' ', 'a', ' ', 'test', '.', '']
下面是一个使用sub()方法的简单例子。它使用单词"colour"来代替颜色名:
>>> p = re.compile( '(blue|white|red)') >>> p.sub( 'colour', 'blue socks and red shoes') 'colour socks and colour shoes' >>> p.sub( 'colour', 'blue socks and red shoes', count=1) 'colour socks and red shoes'
subn() 方法的作用一样,但返回的是包含新字符串和替换执行次数的两元组。
>>> p = re.compile( '(blue|white|red)') >>> p.subn( 'colour', 'blue socks and red shoes') ('colour socks and colour shoes', 2) >>> p.subn( 'colour', 'no colours at all') ('no colours at all', 0)
空匹配只有在它们没有紧挨着前一个匹配时才会被替换掉。
>>> p = re.compile('x*') >>> p.sub('-', 'abxd') '-a-b-d-'
在下面的例子中,替换函数转换十进制到十六进制:
>>> def hexrepl( match ): ... "Return the hex string for a decimal number" ... value = int( match.group() ) ... return hex(value) ... >>> p = re.compile(r'\d+') >>> p.sub(hexrepl, 'Call 65490 for printing, 49152 for user code.') 'Call 0xffd2 for printing, 0xc000 for user code.'
re.VERBOSE 标
志有点作用。正则表达式中不在字符类中的空白符被忽略。这就意味着象 dog | cat 这样的表达式和可读性差的 dog|cat等同,
但 [a b] 将仍就匹配字符 "a"、"b" 或 空格。另外,你也可以把注释放到正则表达式中;注释是从 "#" 一直到换行。当使用三引号字符串
时,可以使正则表达式更优美:
pat = re.compile(r""" \s* # Skip leading whitespace (?P[^:]+) # Header name \s* : # Whitespace, and a colon (?P.*?) # The header's value -- *? used to # lose the following trailing whitespace \s*$ # Trailing whitespace to end-of-line """, re.VERBOSE)
这比下面的更易读: pat = re.compile(r"\s*(?P[^:]+)\s*:(?P.*?)\s*$")