令人惊讶的是,
的输出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
吗
答案 0 :(得分:2)
来自perlretut:
如果正则表达式中的分组是嵌套的,则$ 1将使用 最左边的左括号,下一个左括号$ 2等等。
来源:http://perldoc.perl.org/perlretut.html
Python的正则表达式引擎基于Perl,因此行为类似。
所以:
a=(([-+]?(\d*[.])?\d+)
外部捕获组,即2323.232323
==第1组
a=(([-+]?(\d*[.])?\d+)
内部捕获组,即(\d*[.])
,即2323.
==第2组
b=([-+]?(\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
答案 1 :(得分:2)
当您的捕获组变得复杂时,有时使用命名捕获组会更容易。例如:
pattern = r'a=(?P<thisisa>[-+]?(\d*[.])?\d+) b=(?P<thisisb>[-+]?(\d*[.])?\d+) c=(?P<thisisc>[-+]?(\d*[.])?\d+)'
tobereplacedwith = r'thisisb=\g<thisisb> thisisa=\g<thisisa> thisisc=\g<thisisc>'
要创建名为foo
的捕获组,请使用(?<foo>...)
。要创建对它的反向引用,请使用(?=foo)
。要获取它的内容,请使用\g<foo>
。
答案 2 :(得分:1)
这是你的正则表达式,当前的分组是:
Formatted and tested:
a=
( # (1 start)
[-+]?
( \d* [.] )? # (2)
\d+
) # (1 end)
\ b=
( # (3 start)
[-+]?
( \d* [.] )? # (4)
\d+
) # (3 end)
\ c=
( # (5 start)
[-+]?
( \d* [.] )? # (6)
\d+
) # (5 end)
输出:
** Grp 0 - ( pos 0 , len 27 )
a=2323.232323 b=23.23 c=112
** Grp 1 - ( pos 2 , len 11 )
2323.232323
** Grp 2 - ( pos 2 , len 5 )
2323.
** Grp 3 - ( pos 16 , len 5 )
23.23
** Grp 4 - ( pos 16 , len 3 )
23.
** Grp 5 - ( pos 24 , len 3 )
112
** Grp 6 - NULL
您不需要可选捕获子组 将它们转换为群集组后:
# a=([-+]?(?:\d*[.])?\d+) b=([-+]?(?:\d*[.])?\d+) c=([-+]?(?:\d*[.])?\d+)
a=
( # (1 start)
[-+]?
(?: \d* [.] )?
\d+
) # (1 end)
\ b=
( # (2 start)
[-+]?
(?: \d* [.] )?
\d+
) # (2 end)
\ c=
( # (3 start)
[-+]?
(?: \d* [.] )?
\d+
) # (3 end)
输出:
** Grp 0 - ( pos 0 , len 27 )
a=2323.232323 b=23.23 c=112
** Grp 1 - ( pos 2 , len 11 )
2323.232323
** Grp 2 - ( pos 16 , len 5 )
23.23
** Grp 3 - ( pos 24 , len 3 )
112