如何在此示例中使用regularexression?

时间:2017-01-04 22:29:52

标签: python regex

我正在尝试为此行编写正则表达式:

- 5.0 - 4.0 - 3.0 ... + 12.0

它可以将带有符号的浮动组合在一个组中(-5.0,-4.0 ......)

我试过了:

\s*([+](?:\s)*\d*[.])

但显然它并没有忽略捕获组内的非捕获组。 有什么建议可以解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

根据您的要求:

  

它可以将带有符号的浮动组合在一个组中(-5.0,-4.0 ......)

使用re.findall()函数的解决方案:

s = '-  5.0   -  4.0   -  3.0  ... +  12.0'
signed_floats = [re.sub(r'\s+', r'', f) for f in re.findall(r'-\s*\d+\.\d+\b', s)]

print(signed_floats)

输出:

['-5.0', '-4.0', '-3.0']

答案 1 :(得分:1)

这是你可以尝试的东西:

(\+|-)\s*(\d+\.\d+)\s*

虽然,您将始终使用尾随逗号,因此您必须将其删除。

Here is a demo

答案 2 :(得分:1)

您的捕获组包含以下元素:

  • [+]与文字+
  • 相匹配
  • (?:\s)*匹配任意数量的空白字符
  • \d*匹配任意数量的数字
  • [.]与文字.
  • 相匹配

现在,它匹配加号后跟空格后跟数字后跟小数点。但听起来你想要连续匹配几个符号空间数字 - 十进制数字序列,只要它们具有相同的符号。我会这样做:

  1. 从表达式开始,以匹配单个此类序列:

    [+-]\s*\d+[.]\d+
    

    这匹配正负,然后是空格,然后是数字,小数点,数字。

  2. 您需要保存符号以确保模式的其余部分仅匹配具有相同符号的序列。所以建立一个捕获组。

    ([+-])\s*\d+[.]\d+
    
  3. 现在让我们重复这个模式(带有一些中间空格)来匹配另一个组,除了我们要确保标志是相同的,所以我们使用反向引用。

    ([+-])\s*\d+[.]\d+\s*\1\s*\d+[.]\d+
    

    \1匹配通过捕获组号1匹配的任何内容。在这种情况下,这是符号,+-。此模式将匹配具有相同符号的两个连续序列。

  4. 现在更改模式的第二部分以匹配零个或多个其他序列。

    ([+-])\s*\d+[.]\d+(?:\s*\1\s*\d+[.]\d+)*
    
  5. 最后,您可以在比赛前后留出空格。这可以通过明智地使用search函数或findall而不是match来解决。然后,您可以使用不带参数的match_object.group()来获取匹配的序列,这就是您想要的。