, глядя на другие ответы, которые я видел, что вы можете использовать регулярные выражения для этого, вот пример:
let scriptRegex = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi;
let styleRegex = /((<style>)|(<style type=.+))((\s+)|(\S+)|(\r+)|(\n+))(.+)((\s+)|(\S+)|(\r+)|(\n+))(<\/style>)/g;
// An example html content
const str = `
my cool html content
<style>
...
</style>
my cool html content
<style type="text/css">
...
</style>
my cool html content
<script>
...
</script>
my cool html content`;
// Strip the tags from the html
let result = str.replace(scriptRegex, '');
result = result.replace(styleRegex, '');
// There you go :)
console.log('Substitution result: ', result);
Надеюсь, это поможет!
itertools.groupby
кажется, соответствует отлично! Просто определите a next_morris
функция следующим образом:
def next_morris(number):
return ''.join('%s%s' % (len(list(group)), digit)
for digit, group in itertools.groupby(str(number)))
Это все!!! Взгляд:
print next_morris(1)
11
print next_morris(111221)
312211
Я мог использовать это для создания генератора:
def morris_generator(maxlen, start=1):
num = str(start)
while len(num) < maxlen:
yield int(num)
num = next_morris(num)
Использование:
for n in morris_generator(10):
print n
результаты:
1
11
21
1211
111221
312211
13112221
from itertools import groupby, islice
def morris():
morris = '1'
yield morris
while True:
morris = groupby(morris)
morris = ((len(list(group)), key) for key, group in morris)
morris = ((str(l), k) for l, k in morris)
morris = ''.join(''.join(t) for t in morris)
yield morris
print list(islice(morris(), 10))
В первую очередь, я сделал бы итератор бесконечным и позволять потребителю решить, сколько из него он хочет. Тем путем он мог или получить каждое morris число, которое короче, чем x или первые x числа и т.д.
Затем нет, очевидно, никакой потребности сохранить целый список предыдущих morris чисел в списке, так как рекурсия только n := f(n-1)
так или иначе.
Наконец, с помощью itertools, чтобы дать ему функциональное касание всегда стоит точки фаната или два ;) Я разделил выражение генератора на несколько строк для создания этого немного более симпатичным.
Основное уродство в этом решении прибывает из факта это len()
не может быть назван на итераторе и дает нам интервал, где нам нужна ул. Другое отклонение является вложенным str.join) сглаживать все это в ул. снова.
Если Вы хотите запустить последовательность с произвольных чисел, определите функцию как это:
def morris(morris=None):
if morris is None:
morris = '1'
[...]
Если Вы хотите изменить к лучшему тот генератор, можно записать это как это:
def morris():
morris = '1'
yield morris
while True:
print morris
morris = ''.join(''.join(t)
for t in ((str(len(list(group))), key)
for key, group in groupby(morris)))
yield morris
Я не уверен, что мне нравится разделение на две функции, но это, кажется, самое читаемое решение:
def m_groupby(s):
for key, group in groupby(s):
yield str(len(list(group)))
yield key
def morris():
morris = '1'
yield morris
while True:
morris = ''.join(m_groupby(morris))
yield morris
Надеюсь, что Вам нравится он!