我正在尝试为此行编写正则表达式:
- 5.0 - 4.0 - 3.0 ... + 12.0
它可以将带有符号的浮动组合在一个组中(-5.0,-4.0 ......)
我试过了:
\s*([+](?:\s)*\d*[.])
但显然它并没有忽略捕获组内的非捕获组。 有什么建议可以解决这个问题吗?
答案 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)
答案 2 :(得分:1)
您的捕获组包含以下元素:
[+]
与文字+
(?:\s)*
匹配任意数量的空白字符\d*
匹配任意数量的数字[.]
与文字.
现在,它匹配加号后跟空格后跟数字后跟小数点。但听起来你想要连续匹配几个符号空间数字 - 十进制数字序列,只要它们具有相同的符号。我会这样做:
从表达式开始,以匹配单个此类序列:
[+-]\s*\d+[.]\d+
这匹配正负,然后是空格,然后是数字,小数点,数字。
您需要保存符号以确保模式的其余部分仅匹配具有相同符号的序列。所以建立一个捕获组。
([+-])\s*\d+[.]\d+
现在让我们重复这个模式(带有一些中间空格)来匹配另一个组,除了我们要确保标志是相同的,所以我们使用反向引用。
([+-])\s*\d+[.]\d+\s*\1\s*\d+[.]\d+
\1
匹配通过捕获组号1匹配的任何内容。在这种情况下,这是符号,+
或-
。此模式将匹配具有相同符号的两个连续序列。
现在更改模式的第二部分以匹配零个或多个其他序列。
([+-])\s*\d+[.]\d+(?:\s*\1\s*\d+[.]\d+)*
search
函数或findall
而不是match
来解决。然后,您可以使用不带参数的match_object.group()
来获取匹配的序列,这就是您想要的。