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 パラメーターは、「検索」の両側にある単語数を示します

4

1 に答える 1

0

特定の例(正規表現の「単語」定義、つまり文字、数字、アンダースコアを含むものを使用する場合)では、正規表現は次のようになります。

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

\w上記の単語文字の 1 つに一致します。\W他の文字と一致します。パラメータがパターンのどこに行くかは明らかだと思います。パターンはre.searchまたはで使用できますre.findall

問題は、クエリの前後に必要な量の単語がない場合 (つまり、文字列の一方の端に近すぎる場合) です。しかし、あなたは逃げることができるはずです:

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

繰り返しの貪欲さのおかげで。いずれにせよ、複数の結果が必要な場合は、一致が重複しないことに注意してください。したがって、最初のパターンを使用すると、最初の一致のみが取得され、2 つの出現がfind互いに接近している場合にのみ取得されますが、2 番目のパターンでは、2 番目nの前に単語は取得されませんfind(既に消費されたものは、ない)。特に、 の 2 つのオカレンスfindがより近くにありn、2 番目findがすでに最初の一致の一部になっている場合、2 番目の一致はまったく得られません。

単語を空白文字ではないものとして扱いたい場合、アプローチは似ています。

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

それ以外の場合は、自分で文字クラスを考え出す必要があると思います。

于 2012-12-09T20:40:47.967 に答える