我需要获取一个包含字符串hello
中每两个相邻字符的列表,以便
['he', 'el', 'll', 'lo']
我以为我可以这样做
>>>import re
>>>re.findall(r'..', 'hello')
['he', 'll']
这不是我想要的。我需要使用正则表达式
获取上面提到的列表答案 0 :(得分:5)
>>> re.findall(r'(?=(\w\w))', 'hello')
['he', 'el', 'll', 'lo']
阅读链接的线程,了解它背后的更多逻辑。
不需要正则表达式。你可以使用列表理解。
h = 'hello'
a = [h[i:i+2] for i in range(len(h)-1)]
结果:
['he', 'el', 'll', 'lo']
编辑:RoadRunner的zip / map解决方案更优雅。也就是说,这个解决方案是可扩展的,所以如果你愿意,你可以得到的不仅仅是2个相邻的字符:
func = lambda my_list, n: [my_list[i:i+n] for i in range(len(my_list)-n+1)]
# OR, as RoadRunner suggested a cleaner read if you don't like lambdas:
def func(my_list, n): return [my_list[i:i+n] for i in range(len(my_list)-n+1)]
这会给你:
>>> func('hello', 2)
['he', 'el', 'll', 'lo']
>>> func('hello', 3)
['hel', 'ell', 'llo']
>>> func('hello', 4)
['hell', 'ello']
答案 1 :(得分:4)
此处不需要正则表达式,您可以使用zip()
>>> s = "hello"
>>> [x + y for x, y in zip(s, s[1:])]
['he', 'el', 'll', 'lo']
甚至是map()
的功能性方法:
>>> list(map(lambda x, y: x + y, s, s[1:]))
['he', 'el', 'll', 'lo']
如果你想要一种处理任意数量的相邻字符的方法,你可以尝试使用滑动窗口方法,它接受第一个n
字符,然后弹出第一个字符,并重复这个,直到没有更多的子字符串可以被采取。
以下是一个例子:
from collections import deque
from itertools import islice
def every_n(s, n):
result = []
items = deque(s)
while len(items) >= n:
result.append(''.join(islice(items, 0, n)))
items.popleft()
return result
其工作原理如下:
>>> print(every_n('hello', 2))
['he', 'el', 'll', 'lo']
>>> print(every_n('hello', 3))
['hel', 'ell', 'llo']
>>> print(every_n('hello', 4))
['hell', 'ello']
>>> print(every_n('hello', 5))
['hello']