我在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
的原因任何帮助都会很棒。感谢
答案 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
等。