将此str
var拆分为连续数字列表
我的解决方案:
>>> str
> '2223334441214844'
>>> filter(None, re.split("(0+)|(1+)|(2+)|(3+)|(4+)|(5+)|(6+)|(7+)|(8+)|(9+)", str))
> ['222', '333', '444', '1', '2', '1', '4', '8', '44']
答案 0 :(得分:4)
没有正则表达式的一种解决方案(不是数字特定的)将使用itertools.groupby()
:
>>> from itertools import groupby
>>> s = '2223334441214844'
>>> [''.join(g) for _, g in groupby(s)]
['222', '333', '444', '1', '2', '1', '4', '8', '44']
答案 1 :(得分:4)
更灵活的方法是使用itertools.groupby
来匹配迭代中的连续组:
>>> s = '2223334441214844'
>>> import itertools
>>> [''.join(group) for key, group in itertools.groupby(s)]
['222', '333', '444', '1', '2', '1', '4', '8', '44']
key
将是分组的单个键(在您的情况下,数字)。 group
是组中所有项目的可迭代项。由于源iterable是一个字符串,因此每个项都是一个字符,所以为了返回完全组合的组,我们需要将这些字符重新组合在一起。
您还可以重复该组长度的键以获得此输出:
>>> [key * len(list(group)) for key, group in itertools.groupby(s)]
['222', '333', '444', '1', '2', '1', '4', '8', '44']
如果您想使用正则表达式,您可以使用反向引用来查找连续字符,而无需明确指定它们:
>>> re.findall('((.)\\2*)', s)
[('222', '2'), ('333', '3'), ('444', '4'), ('1', '1'), ('2', '2'), ('1', '1'), ('4', '4'), ('8', '8'), ('44', '4')]
为了查找字符串中的连续字符,这与groupby
将完成的内容基本相同。然后,您可以过滤掉组合匹配以获得所需结果:
>>> [x for x, *_ in re.findall('((.)\\2*)', s)]
['222', '333', '444', '1', '2', '1', '4', '8', '44']
答案 2 :(得分:1)
如果您只需要提取连续的相同数字,您可以使用var emitter = {};
EventEmitter.call(emitter);
console.log(emitter.on);
正则表达式的匹配方法:
r'(\d)\1*'
请参阅Python demo
在这里,
import re
s='2223334441214844'
print([x.group() for x in re.finditer(r'(\d)\1*', s)])
# => ['222', '333', '444', '1', '2', '1', '4', '8', '44']
- 匹配并捕获第1组任意数字(\d)
- 对第1组的反向引用,匹配相同的值,0 +重复。此解决方案可以自定义以匹配任何特定的连续字符(而不是\1*
,您可以使用\d
- 非空白,\S
- 字,\w
- 特定的一组等)。如果您将[a-fA-F]
替换为\d
并使用.
修饰符,则它将作为上面发布的re.DOTALL
解决方案。
答案 3 :(得分:1)
使用捕获组和反向引用。
str = '2223334441214844'
import re
print([i[0] for i in re.findall(r'((\d)\2*)', str)])
\2
匹配匹配的(\d)
捕获组。列表理解是必需的,因为当RE包含捕获组时,findall
返回捕获组的列表,而不是整个匹配。所以我们需要一个额外的组来获得整个匹配,然后需要从结果中提取该组。
答案 4 :(得分:0)
如果不导入任何外部模块怎么样?
您可以在纯python中创建自己的逻辑而无需导入任何模块这是递归方法,
string_1='2223334441214844'
list_2=[i for i in string_1]
def con(list_1):
group = []
if not list_1:
return 0
else:
track=list_1[0]
for j,i in enumerate(list_1):
if i==track[0]:
group.append(i)
else:
print(group)
return con(list_1[j:])
return group
print(con(list_2))
输出:
['2', '2', '2']
['3', '3', '3']
['4', '4', '4']
['1']
['2']
['1']
['4']
['8']
['4', '4']