/** Function that count occurrences of a substring in a string; * @param {String} string The string * @param {String} subString The sub string to search for * @param {Boolean} [allowOverlapping] Optional. (Default:false) * * @author Vitim.us https://gist.github.com/victornpb/7736865 * @see Unit Test https://jsfiddle.net/Victornpb/5axuh96u/ * @see http://stackoverflow.com/questions/4009756/how-to-count-string-occurrence-in-string/7924240#7924240 */ function occurrences(string, subString, allowOverlapping) { string += ""; subString += ""; if (subString.length <= 0) return (string.length + 1); var n = 0, pos = 0, step = allowOverlapping ? 1 : subString.length; while (true) { pos = string.indexOf(subString, pos); if (pos >= 0) { ++n; pos += step; } else break; } return n; }
Использование
occurrences("foofoofoo", "bar"); //0 occurrences("foofoofoo", "foo"); //3 occurrences("foofoofoo", "foofoo"); //1
allowOverlapping
occurrences("foofoofoo", "foofoo", true); //2
Совпадения:
foofoofoo 1 `----´ 2 `----´
Единичный тест
Я проверил тестовый тест и моя функция более чем в 10 раз быстрее, чем функция соответствия регулярному выражению, отправленная gumbo. В моей тестовой строке длина 25 символов. с 2 вхождениями символа 'o'. Я выполнил 1 000 000 раз в Safari.
Safari 5.1
Benchmark> Общее время исполнения: 5617 ms (regexp)
Benchmark> Общее время исполнения: 881 ms (моя функция в 6.4 раза быстрее)
Firefox 4
Benchmark> Общее время исполнения: 8547 мс (Rexexp)
Benchmark> Общее время исполнения: 634 мс (моя функция на 13,5 раз быстрее)
Изменить: изменения, которые я сделал
Gist
- длина кешированной кешировки
- добавлена листинг типа в строку .
- добавлен дополнительный параметр «allowOverlapping»
- исправленный правильный вывод для «пустого случая подстроки».
Думаю, вам просто нужно добавить `nargs = '?' к аргументам. Это позволяет использовать трехсторонний вход - значение по умолчанию, константу и значение пользователя.
Тот факт, что вы используете их во взаимоисключающей группе, не имеет значения.
In [3]: parser = argparse.ArgumentParser()
...: group_input = parser.add_mutually_exclusive_group(required=True)
...: group_input.add_argument("-s","--serial-number", default=1,nargs='?',const=2,type=int);
...: group_input.add_argument("-e","--event", default=1,nargs='?',const=3,type=int);
...:
...:
In [4]: parser.parse_args('-s'.split())
Out[4]: Namespace(event=1, serial_number=2)
In [5]: parser.parse_args('-s 1234'.split())
Out[5]: Namespace(event=1, serial_number=1234)
In [6]: parser.parse_args('-e'.split())
Out[6]: Namespace(event=3, serial_number=1)
In [7]: parser.parse_args('-e 1232'.split())
Out[7]: Namespace(event=1232, serial_number=1)
In [8]: parser.parse_args('-e 1232 -s'.split())
usage: ipython3 [-h] (-s [SERIAL_NUMBER] | -e [EVENT])
ipython3: error: argument -s/--serial-number: not allowed with argument -e/--event
....
Поскольку группа required
, вы должны указать один из аргументов -s
или -e
In [9]: parser.parse_args(''.split())
usage: ipython3 [-h] (-s [SERIAL_NUMBER] | -e [EVENT])
ipython3: error: one of the arguments -s/--serial-number -e/--event is required
....
A store_true
.