Калькулятор для строк, которые игнорируют слова

У меня как 1000 строк, содержащих что-то вроде этого:

Brought 20 shoes for 100 each
Brought 3 computers for 200 each
Brought 100 shares of Apple for 8 each
Brought 100 Rubix cube for 2 each

и т.п.

Мне нужно записать историю заказов и указать окончательную цену. Я хочу иметь то, что рассчитать каждую строку. Умножьте и дайте мне ответы:

2000
600
800
200

Я уже удалил знаки $ и т. Д. С помощью регулярных выражений в блокноте ++. Если я удаляю все, кроме цифр, используя регулярное выражение, оно будет отображаться в одной строке.

Не обязательно быть в javascript или python, если для меня есть хитрость или веб-сайт, это было бы здорово. На самом деле я понятия не имею, как это сделать в javascript или python, так как я новичок и в javascript, и в python, но для python я думаю, что вы можете что-то сделать с for for loop и функцией strip. Если это на Python, я могу только перетащить файл в командную строку.

Всего 5 ответов


HTML:

<textarea id="mytext" style="width:400px;height:100px;">
Brought 20 shoes for 100 each
Brought 3 computers for 200 each
Brought 100 shares of Apple for 8 each
Brought 100 Rubix cube for 2 each
</textarea>

<textarea id="myresult" style="width:400px;height:100px;">
</textarea>

JS:

var element1 = document.getElementById("mytext");
var element2 = document.getElementById("myresult");
var lines = element1.value.split('
');
element2.value = ''
for(var i = 0;i < lines.length;i++){
   var line = lines[i];
   var numbers = line.match(/[0-9]+/g);
   if (numbers.length == 2) {
    element2.value = element2.value + (numbers[0]*numbers[1]);
   }
   element2.value = element2.value + '
'
}

https://jsfiddle.net/fdk8e5y3/2/


Вы можете использовать re.findall и np.prod чтобы получить желаемый результат.

  1. re.findall возвращает список всех совпадений с шаблоном. d+ используется для числа.

  2. np.prod возвращает произведение всех элементов в нем.


Код Python:

import re
import numpy as np
_str='''Brought 20 shoes for 100 each
Brought 3 computers for 200 each
Brought 100 shares of Apple for 8 each
Brought 100 Rubix cube for 2 each'''

for i in _str.split('
'):
     print(np.prod([int(j) for j in re.findall('d+',i)]))

2000
600
800
200

Всегда есть только два значения в строке? Попробуйте это в JavaScript:

const yourString = `Brought 20 shoes for 100 each
Brought 3 computers for 200 each
Brought 100 shares of Apple for 8 each
Brought 100 Rubix cube for 2 each`;

const numbers = yourString.match(/d+/g);

for (let i = 0; i < numbers.length; i += 2) {
  console.log(numbers[i] * numbers[i + 1]);
}

Помните, что это код стандарта ES2015 («ES6»), то есть он не будет работать как есть в IE11. Если вы хотите запустить его в старых браузерах (вплоть до IE4), просто замените галочки на " и поместите входную строку в одну строку, разделенную на . Также замените оба const и let на var .


JS однострочник

const str = `
Brought 20 shoes for 100 each
Brought 3 computers for 200 each
Brought 100 shares of Apple for 8 each
Brought 100 Rubix cube for 2 each
`;

str.trim()
   .split('
')
   .map(line => 
       line.match(/d+/g)
       .map(Number)
       .reduce((acc, val) => acc *= val, 1)
   );

Используя matchAll с регулярным выражением m ultiline, можно получить 2 числа.

Затем из этих захваченных групп продукты могут быть сопоставлены с массивом.

Пример фрагмента:

let text = `Brought 20 shoes for 100 each
Brought 3 computers for 200 each
Brought 100 shares of Apple for 8 each
Brought 100 Rubix cube for 2 each`;

let re = /^Broughts*(d+).*fors*(d+)/mgi;
let broughtTotals = [...text.matchAll(re)].map((x,i)=>parseInt(x[1])*parseInt(x[2]));

broughtTotals.forEach((total, idx)=> document.write(`${total}<br/>`));


Есть идеи?

10000