regex Python正则表达式在滑动对中的捕获[重复]

iovurdzv  于 12个月前  发布在  Python
关注(0)|答案(1)|浏览(105)

此问题在此处已有答案

Regex - match everything without whitespace(2个答案)
Regex match entire words only(7个答案)
26天前关闭
截至25天前,社区正在审查是否重新讨论这个问题。
假设我有一个类似'a -> b -> c'的字符串,我正在寻找一个正则表达式来捕获成对的组,以获得输出[('a','b'), ('b','c')]
我试过re.findall(r'(.+)(?=\->(.+))', r'a -> b -> c'),但这并没有产生所需的输出。
要捕获的值,即'a', 'b', 'c'通常不只是字母数字。很抱歉没有从一开始就指定这一点,但我认为我对(.+)的使用使这一点变得明显。所以,也许更一般的情况是
'a1 -> b1 b2-b3->c1 c2'
所需输出[('a1', 'b1 b2-b3'), ('b1 b2-b3', c1 c2)]

jxct1oxe

jxct1oxe1#

您可以使用\w/\S来代替过于宽泛的.

re.findall(r'(\S+)(?= -> (\S+))', r'a -> b -> c')

个字符
输出:[('a', 'b'), ('b', 'c')]
另一个更一般的例子:

re.findall(r'\b((?:(?!->).)+)\b(?=\s*->\s*\b((?:(?!->).)+)\b)',
           'a1 -> b1 b2-b3->c1 c2')


输出:[('a1', 'b1 b2-b3'), ('b1 b2-b3', 'c1 c2')]
regex demo
或者,如评论中所建议的,一个非纯正则表达式解决方案,用itertools.pairwisere.split的输出进行后处理:

from itertools import pairwise

out = list(pairwise(re.split(r'\s*->\s*', 'a1 -> b1 b2-b3->c1 c2')))

相关问题