令人惊讶的是,
import re
s = "a=2323.232323 b=23.23 c=112 d=12"
pattern = r'a=([-+]?(\d*[.])?\d+) b=([-+]?(\d*[.])?\d+) c=([-+]?(\d*[.])?\d+)'
tobereplacedwith = r'thisisb=\2 thisisa=\1 thisisc=\3'
print re.sub(pattern, tobereplacedwith, s)
是
thisisb=2323. thisisa=2323.232323 thisisc=23.23 d=12
为什么不产生
thisisb=23.23 thisisa=2323.232323 thisisc=112 d=12
?
最佳答案
从perlretut:
如果正则表达式中的分组是嵌套的,则$ 1将使用
最左边的左括号,$ 2下一个左括号,等等。
资料来源:http://perldoc.perl.org/perlretut.html
Python的regex引擎基于Perl的引擎,因此其行为类似。
所以:a=(([-+]?(\d*[.])?\d+)
外部捕获组,即2323.232323
==组1a=(([-+]?(\d*[.])?\d+)
内部捕获组,即(\d*[.])
即2323.
==组2b=([-+]?(\d*[.])?\d+)
外部捕获组,即23.23
==组3
要获得所需的输出,请尝试以下操作:
import re
s = "a=2323.232323 b=23.23 c=112 d=12"
pattern = r'a=([-+]?(\d*[.])?\d+) b=([-+]?(\d*[.])?\d+) c=([-+]?(\d*)([.]\d*)?)'
tobereplacedwith = r'thisisb=\3 thisisa=\1 thisisc=\6'
print re.sub(pattern, tobereplacedwith, s)
输出:
thisisb=23.23 thisisa=2323.232323 thisisc=112 d=12