有一个大字符串,我需要找到所有包含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'每侧应该有多少个单词
答案 0 :(得分: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}'
对于其他任何事情,你必须自己想出角色课程。我猜。