2

有一个大字符串,我需要找到所有包含正好 N 个单词的子字符串(如果可能的话)。

例如:

big_string = "The most elegant way to find n words in String with the particular word"
N = 2
find_sub(big_string, 'find', N=2) # => ['way to find n words']

我试图用正则表达式来解决它,但它碰巧比我最初预期的要复杂。我刚刚忽略了一个优雅的解决方案吗?

更新

我们所说的单词是指由 \b 分隔的所有内容

N参数表示'find'每边应该有多少个单词

4

1 回答 1

0

对于您的具体示例(如果我们使用正则表达式的“单词”定义,即包含字母、数字和下划线的任何内容),正则表达式将如下所示:

r'(?:\w+\W+){2}find(?:\W+\w+){2}'

\w匹配所述单词字符之一。\W匹配任何其他字符。我认为你的参数在模式中的位置很明显。您可以将模式与re.search或一起使用re.findall

问题是您的查询周围的单词数量是否少于所需数量(即,如果它太靠近字符串的一端)。但你应该能够逃脱:

r'(?:\w+\W+){0,2}find(?:\W+\w+){0,2}'

由于贪婪的重复。请注意,在任何情况下,如果您想要多个结果,匹配项永远不能重叠。所以如果你使用第一个模式,你只会得到第一个匹配,如果两个出现find彼此接近,而在第二个中,你不会n在第二个之前得到单词find(已经消耗的单词将是失踪)。特别是,如果两次出现的find距离比第二次更近n,那么第二次find就已经是第一次匹配的一部分,那么你根本无法获得第二次匹配。

如果您想将单词视为不是空格字符的任何内容,则该方法看起来相似:

r'(?:\S+\s+){0,2}find(?:\s+\S+){0,2}'

我猜,对于其他任何事情,您都必须自己提出角色类。

于 2012-12-09T20:40:47.967 回答