Выражение Regex для извлечения коэффициента линейного уравнения "2x-3y + 0,5" - PullRequest
0 голосов
/ 23 июня 2019

Я хочу преобразовать мой эквалайзер в векторную форму, поэтому мне нужно извлечь коэффициент

r"[-+]?\d*\.\d+|\d+" Я пробовал это, но я не могу получить знак "-" вместе с целым числом. За 2x-3y + 0 я получаю [2, 3, 0], но мне нужно [2, -3, 0].

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Просто используйте лучшее регулярное выражение.

>>>import re
>>>eqn = '2x-3y+0'
>>>re.findall(r'(-?(?:\d+(?:\.\d*)?|\.\d+))', eqn)
['2', '-3', '0']
1 голос
/ 23 июня 2019

Выражение в этом ответе намного лучше, поскольку, например, оно не захватывает +.

Сказав это, я думаю, что ваше разработанное выражение также просто прекрасно, может быть, мы немного изменим это:

[-+]?\d+\.\d+|[-+]?\d+

и это, вероятно, сработает, поскольку проверка не требуется.

Пожалуйста, ознакомьтесь с демонстрацией и объяснением здесь.

Тест

import re

matches = re.finditer(r"[-+]?\d+\.\d+|[-+]?\d+", "-0.2x-0.73y-0.11z-0.2x-0.73y-0.11")
linear_eq_coeff=[]

for match in matches:
    linear_eq_coeff.append(match.group())
print linear_eq_coeff

выход

['-0.2', '-0.73', '-0.11', '-0.2', '-0.73', '-0.11']

Демо

const regex = /[-+]?\d+\.\d+|[-+]?\d+/gm;
const str = `-0.2x-0.73y-0.11z-0.2x-0.73y-0.11`;
let m;

arr = [];

while ((m = regex.exec(str)) !== null) {
	// This is necessary to avoid infinite loops with zero-width matches
	if (m.index === regex.lastIndex) {
		regex.lastIndex++;
	}

	// The result can be accessed through the `m`-variable.
	m.forEach((match, groupIndex) => {
		console.log(`Found match, group ${groupIndex}: ${match}`);
		arr.push(match);
	});
}

console.log(arr);

Рекомендации

wjandrea Совет таков:

Можно упростить до [-+]?(\d*\.)?\d+

...