用re.sub。匹配和替换浮点数

时间:2015-11-11 20:24:46

标签: python regex

令人惊讶的是,

的输出
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

3 个答案:

答案 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