仅提取线性方程中的常数值

Posted

技术标签:

【中文标题】仅提取线性方程中的常数值【英文标题】:Extract only the constant value in a linear equation 【发布时间】:2020-08-14 04:50:57 【问题描述】:

我试图从ax+by+c 类型的线性方程中仅提取常数值,即带有符号的“c 值”。 注意:- 线性方程作为字符串输入。 例如:- 2x+3y+4 输出 = +4 2x+3y-4 输出 = -4 -3+2y+1x 输出 = -3 2+6x+1yOutput = 2 4y+3-5xOutput = +3 在上面的每个示例中,我只想要带符号的 c 值,即常量值。

我尝试了许多正则表达式模式代码。但无法获得任何通用解决方案来提取常数值 以下是我在 python 3 中可以得到的最好的,但在很多情况下它也不适合我。

conatsant_c = re.complie(r'([+-]?[0-9]\d*)([^x|^y])')

【问题讨论】:

首先,我建议您将[0-9]\d* 替换为更简洁的[0-9]+\d+,以检查一个或多个数字。其次,您可能希望第二个字符类只是[^xy],因为这将检查所有不是xy 的字符。 您可以使用正则表达式-?\d+(?![a-z])(?![a-z]) 作为负前瞻。 Demo @CarySwoveland 失败例如“11x+3y+3”,它只在开始时选择除一位之外的所有数字。 .match(/[\-+]?\d+(?=[\-+]|$)/)[0] 怎么样? @CarySwoveland 是的,但仅适用于此示例。不适用于 2x+3y-4+y5 感谢使用 -?\d+(?![a-z]) 为我工作... 【参考方案1】:

您可以使用这个正则表达式,它使用负前瞻来断言数字后面没有字母:

-?\d+(?:\.\d+)?(?![\d.]*[a-z])

Demo on regex101

这也适用于浮点数。

在python中:

import re

strs = ['21x+3y+45',
        '2x+3y-4.2',
        '-3.4+12y+1x',
        '2+6x+41.2y',
        '4y+13.1-5x'
        ]

for s in strs:
    const = re.search(r'-?\d+(?:\.\d+)?(?![\d.]*[a-z])', s)
    print(const.group(0))

输出:

45
-4.2
-3.4
2
13.1

【讨论】:

-?[\+|\-]0,1\d+(?:\.\d+)?(?![\d.]*[a-z]) 所以会是最准确的 @Andran 捕获 + 是多余的,除非前面有 - 符号,否则数字始终为正数。此外,您的建议允许 -- 不是有效数字。而[\+|\-]允许字符串中有|,这绝对是无效的。 你可以测试我的答案 (?![\d.]* 很好。 @Sameer -?\d+(?:\.\d+)?(?=x) 应该可以工作:regex101.com/r/hy6EJU/3【参考方案2】:

let secondText = "1.23x+4.56y-7.89";
let cKoef = secondText.match(/[+|-]?\d+(?:\.\d+)+(?!\w)/)[0];

console.log(cKoef)

let mathText = "2222x+3333y+4444";
let cKoef = mathText.match(/([\+|\-]0,1[\d*])+(?![\w])/)[0]

console.log(cKoef);

【讨论】:

注意[\+|\-][+|-] 相同,但我希望您想要[+-](以避免匹配'|')。另外,0,1 通常写成?[\d*]\d* 相同,[\w]\w 相同。 @CarySwoveland [+|-]?\d+(?:\.\d+)+(?!\w) 好吗? )) 正如我所说,我认为您不想匹配 |。如果你解决这个问题并添加-?,你将得到我在上面评论中的建议,但我错了。 @Nick 在他的回答中修复了它。

以上是关于仅提取线性方程中的常数值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 BigQuery 中使用 REGEXP_EXTRACT 仅提取数值?

Java中的常见面试题

在python(odeint)中求解具有时间相关系数的常微分方程

MATLAB常微分方程的数值解法

基于龙格-库塔法Runge-Kutta的常微分方程的求解matlab仿真

SciPy笔记(有初始条件的常微分方程)