在进行字符串的正则替换时,我们可能会希望替换的结果是基于匹配结果的,就是说把匹配的字符串提取出来进行一定的修改再应用回原文。
以 sed
为例:
1 2 |
|
用 &
符号可以把匹配的字符串 "dog"
提取出来,然后在它的前后加上了 *
。
在 Python
使用 re
模块时可以这么写:
1 2 3 4 5 6 7 8 |
|
当传给 re.sub()
方法的第二个参数是一个函数时,re.sub()
会给这个函数传入一个 Match Object
然后以这个函数的返回值作为替换结果。
我们可以通过这个 Match Object
的 grou()
方法获取每次执行替换前的匹配结果。这个方法之所以叫做 group
,是因为我们有时会使用多个匹配模板,同时获取多个(一组)匹配结果,再以 sed
为例:
1 2 |
|
符号 \1
和 \2
对应于第一和第二个括号里我们要提取的字符串。
Python 则如下:
1 2 3 4 5 6 7 8 9 |
|
上一例中的 m.group()
也可以写为 m.goup(0)
,意为把所有结果作为一个字符串取出。
还有一种跟传统正则表达式比较相似的写法:
1 2 3 4 5 6 |
|
用 expand()
方法展开表达式,不过似乎不支持符号 &
。
参考资料
- Regular Expression HOWTO
- Regex in python: is it possible to get the match, replacement, and final string?
- Python Cookbook (3rd Edition): 2.6. Searching and Rplacing Case-Insensitive Text