仅提取线性方程中的常数值
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+1y
Output = 2或 4y+3-5x
Output = +3
在上面的每个示例中,我只想要带符号的 c 值,即常量值。
我尝试了许多正则表达式模式代码。但无法获得任何通用解决方案来提取常数值 以下是我在 python 3 中可以得到的最好的,但在很多情况下它也不适合我。
conatsant_c = re.complie(r'([+-]?[0-9]\d*)([^x|^y])')
【问题讨论】:
首先,我建议您将[0-9]\d*
替换为更简洁的[0-9]+
或\d+
,以检查一个或多个数字。其次,您可能希望第二个字符类只是[^xy]
,因为这将检查所有不是x
和y
的字符。
您可以使用正则表达式-?\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 仅提取数值?
在python(odeint)中求解具有时间相关系数的常微分方程