2012-09-19 45 views
2

我对python中的正则表达式sub有个疑问。所以,我有一些代码行,我想要的是取代所有的浮点值,例如:2.0f,-1.0f ...等..双打2.0,-1.0。我想出了这个正则表达式'[-+]?[0-9]*\.?[0-9]+f',它发现我需要什么,但我不知道如何替换它?正则表达式子

所以这里就是我:

# check if floating point value exists 
if re.findall('[-+]?[0-9]*\.?[0-9]+f', line): 
    line = re.sub('[-+]?[0-9]*\.?[0-9]+f', ????? ,line) 

我不知道?????下要放什么东西,使得它将会取代我在'[-+]?[0-9]*\.?[0-9]+f'发现没有在字符串末尾的字符f

也有可能不止一个浮点值,这就是为什么我用re.findall

任何帮助将是巨大的。由于

回答

6

捕捉你想在一个捕获组保存和使用\1替换操作的文本部分:

line = re.sub(r'([-+]?[0-9]*\.?[0-9]+)f', r'\1' ,line) 

注意findall(或任何类型的搜索的)是不必要的,因为re.sub会寻找该模式本身并在没有匹配的情况下返回字符串。

现在,对于一些正则表达式写作技巧:

  • 总是使用原始字符串(r'...')正则表达式和替换字符串,否则你将需要加倍的反斜杠从Python的字符串解析器逃避它们。只是偶然的,您不需要为\.这样做,因为.不是Python字符串中转义序列的一部分。

  • 使用\d而不是[0-9]来匹配数字。它们是等效的,但\d更容易识别为“数字”,而[0-9]需要通过视觉验证。

  • 您的正则表达式不会识别10.f,这可能是您的输入中的有效十进制数。以各种格式来匹配浮点数比起初看起来要棘手,但简单的Google搜索将会揭示许多合理完整的解决方案。

  • re.X标志将允许你添加任意的空格,甚至给你的正则表达式添加注释。用小的正则表达式可以看起来很愚蠢,但对于大型表达式来说,增加的清晰度是一种生活节省。 (你的正则表达式是接近于阈值。)

下面是实现上述样式的提示扩展正则表达式的例子:

line = re.sub(r''' 
    ([-+]? 
     (?: \d+ (?: \.\d*)? # 12 or 12. or 12.34 
      | 
      \.\d+    # .12 
    ) 
    ) f''', 
    r'\1', line, flags=re.X) 

(?:...)是一个非捕获基团,只用于优先级。)

+1

击败我6秒。我太老了:)。你可能想补充一点,他不需要'findall()',因为're.sub()'会一次完成所有可能的替换。 –

+1

@TimPietzcker你说得对。为了兑现自己的速度,我已经穿上了我的前职业帽,并添加了一些正则表达式提示。 :) – user4815162342

+0

感谢您的澄清和提示 – overloading

1

环绕你想在“捕获组”,以“保持”正则表达式的一部分,例如

'([-+]?[0-9]*\.?[0-9]+)f' 
^     ^

然后你可以参考你的替代使用\1这些捕捉组:

r'\1' 

对于未来的参考,你可以有很多的捕捉组,即\2\3等按顺序开头括号。

相关问题