Python 正则表达式子
我有一个关于python中正则表达式sub的问题。因此,我有一些代码行,我想要的是替换所有浮点值,例如:Python 正则表达式子,python,regex,Python,Regex,我有一个关于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('[-
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的原因
任何帮助都会很好。谢谢捕获要保存在捕获组中的文本部分,并使用
\1
替换运算符:
line = re.sub(r'([-+]?[0-9]*\.?[0-9]+)f', r'\1' ,line)
请注意,findall
(或任何类型的搜索)都是不必要的,因为re.sub
将查找模式本身,如果没有匹配项,则返回不变的字符串
现在,关于正则表达式的几个编写技巧:
- 对于正则表达式和替换字符串,请始终使用原始字符串(
),否则需要将反斜杠加倍以从Python的字符串解析器中转义它们。由于r'…'
不是Python字符串中转义序列的一部分,所以您不需要为
执行此操作只是出于偶然\.
- 使用
而不是\d
匹配数字。它们是等效的,但是[0-9]
对于“数字”更容易识别,而\d
需要进行目视验证[0-9]
- 正则表达式将无法识别
,这可能是输入中的有效十进制数。匹配不同格式的浮点数比一开始看起来要复杂得多,但简单的谷歌搜索将揭示许多合理完整的解决方案10.f
标志将允许您向regexp添加任意空格甚至注释。对于小的正则表达式,这看起来非常愚蠢,但是对于大的表达式,增加的清晰度是一个救命稻草。(正则表达式接近阈值。)re.X
line = re.sub(r'''
( [-+]?
(?: \d+ (?: \.\d* )? # 12 or 12. or 12.34
|
\.\d+ # .12
)
) f''',
r'\1', line, flags=re.X)
(
(?:…)
是一个非捕获组,仅用于优先级。)这是我对所有东西的转到参考regex
结果应该是:
line = re.sub('(<first>[-+]?[0-9]*\).?[0-9]+f', '\g<first>', line)
line=re.sub('([-+]?[0-9]*\).?[0-9]+f','\g',line)
将要“保留”在“捕获组”中的正则表达式部分包围起来,例如
然后,您可以在替换中使用\1
引用这些捕获组:
r'\1'
为了将来的参考,您可以有许多捕获组,例如,
\2
,\3
,等等。按开始括号的顺序。比我快6秒。我年纪太大了,不能做这个:)。您可能想补充一点,他不需要findall()
,因为re.sub()
将同时完成所有可能的替换。@TimPietzcker您说得对。为了弥补自己的速度,我戴上了ex perl pro帽子,并添加了一些regexp技巧:
r'\1'