Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式子_Python_Regex - Fatal编程技术网

Python 正则表达式子

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('[-

我有一个关于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的原因


任何帮助都会很好。谢谢

捕获要保存在捕获组中的文本部分,并使用
\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
    标志将允许您向regexp添加任意空格甚至注释。对于小的正则表达式,这看起来非常愚蠢,但是对于大的表达式,增加的清晰度是一个救命稻草。(正则表达式接近阈值。)

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

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'