Python正则表达式:查找相邻字符

时间:2018-01-13 05:46:53

标签: python regex

我需要获取一个包含字符串hello中每两个相邻字符的列表,以便

['he', 'el', 'll', 'lo']

我以为我可以这样做

>>>import re
>>>re.findall(r'..', 'hello')
['he', 'll']

这不是我想要的。我需要使用正则表达式

获取上面提到的列表

2 个答案:

答案 0 :(得分:5)

好消息!您的问题是exact duplicate of this one,它可以为您提供所需的确切正则表达式:

>>> 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']