使用特定单词在String中查找n个单词的最优雅方式

时间:2012-12-09 20:34:37

标签: python regex string

有一个大字符串,我需要找到所有包含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']

我试图用正则表达式来解决它,但它恰好比我预期的更复杂。我只是忽视了一个优雅的解决方案吗?

UPD

我们的意思是用\ b

分隔的所有内容

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

感谢重复的贪婪。请注意,在任何情况下,如果您想要多个结果,匹配永远不会重叠。因此,如果你使用第一个模式,你将只获得第一个匹配,如果两个find出现彼此接近,而在第二个模式中,你将不会得到n个单词。第二个find(已经消耗的那些将会丢失)。特别是,如果两次出现findn更接近,那么第二次find已经成为第一场比赛的一部分,那么你根本无法获得第二场比赛

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

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

对于其他任何事情,你必须自己想出角色课程。我猜。