正则表达式子

时间:2012-09-19 17:05:10

标签: python regex

我在python中有关于正则表达式sub的问题。所以,我有一些代码行,我想要的是替换所有浮点值,例如:2.0f-1.0f ...等...加倍2.0,{{1} }。我想出了这个正则表达式-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'的内容。

也可能有多个浮点值,这就是我使用re.findall

的原因

任何帮助都会很棒。感谢

3 个答案:

答案 0 :(得分: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,这可能是您输入中的有效十进制数。以各种格式匹配浮点数比起初看起来更棘手,但简单的谷歌搜索将为此揭示许多合理完整的解决方案。

  • re.X标志允许您向正则表达式添加任意空格甚至注释。小的正则表达式看起来很愚蠢,但对于大表达式而言,增加清晰度可以挽救生命。 (您的正则表达式接近阈值。)

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

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

(?:...)是非捕获组,仅用于优先级。)

答案 1 :(得分:1)

这是我所有正则表达式的goto参考。

http://www.regular-expressions.info/named.html

结果应该是这样的:

line = re.sub('(<first>[-+]?[0-9]*\).?[0-9]+f', '\g<first>', line)

答案 2 :(得分:1)

将要保留在“捕获组”中的正则表达式部分包围,例如

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

然后您可以在替换中使用\1来引用这些捕获组:

r'\1'

为了将来参考,您可以按照左括号的顺序拥有许多捕获组,即\2\3等。