如何匹配仅含小写ASCII与空格字符串的所有重叠双词子串?
问题(翻译后)
我有一个仅包含小写ASCII字符和空格的字符串,想要匹配其中所有的双词子串。例如:
longString = 'this is a long string' subStrings = ['this is', 'is a', 'a long', 'long string']
我的核心问题在于这些子串存在明显的重叠,而像/\b[a-z]+\s[a-z]+\b/这类正则表达式只能匹配非重叠子串,得到['this is', 'a long']。我也没搞懂递归的用法,请问该如何解决这个问题?
解决方法
方法一:分割遍历拼接(简单直观)
不用正则也能轻松搞定,步骤很简单:
- 把原字符串按空格分割成单个单词的列表
- 遍历列表,从第0个到倒数第2个单词,每次将当前单词和下一个单词拼接成双词子串
示例代码(Python):
long_string = 'this is a long string' words = long_string.split() sub_strings = [f"{words[i]} {words[i+1]}" for i in range(len(words)-1)] print(sub_strings) # 输出: ['this is', 'is a', 'a long', 'long string']
这种方法逻辑清晰,完全不用纠结正则的重叠匹配问题,新手也能快速上手。
方法二:正则正向预查实现重叠匹配
如果非要用正则,核心是利用正向预查(lookahead)——它不会消耗匹配指针,能让正则引擎在同一个起始位置后继续匹配,从而捕获重叠子串。
正则表达式:
(?=(\b[a-z]+\s[a-z]+\b))
(?=...):正向预查,仅检查当前位置后是否符合规则,不移动匹配指针- 括号内的
\b[a-z]+\s[a-z]+\b:你的原双词匹配规则,括号用于捕获目标子串
Python使用示例:
import re long_string = 'this is a long string' pattern = re.compile(r'(?=(\b[a-z]+\s[a-z]+\b))') matches = pattern.findall(long_string) print(matches) # 输出: ['this is', 'is a', 'a long', 'long string']
内容的提问来源于stack exchange,提问作者oli
相关产品推荐
相关产品推荐

