2

我对 python 中的正则表达式 sub 有疑问。所以,我有一些代码行,我想要的是替换所有浮点值,例如:2.0f, -1.0f...etc..to doubles 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 的原因

任何帮助都会很棒。谢谢

4

3 回答 3

7

捕获要保存在捕获组中的部分文本并使用\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)

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

于 2012-09-19T17:09:02.627 回答
1

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

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

结果应该是这样的:

line = re.sub('(<first>[-+]?[0-9]*\).?[0-9]+f', '\g<first>', line)
于 2012-09-19T17:10:43.763 回答
1

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

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

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

r'\1'

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

于 2012-09-19T17:10:59.367 回答