0

私はこの正規表現にこだわっています

# Find the following keywords: sea, sear, search, 
# Find all overlapping keywords 
p = re.compile(r'(sea)+(r?((ch)?))')

pos = 0
while pos<len(s):
    m = p.search(s,pos)
    if m:
       pos = m.end()
       w = m.group()
       g = m.groups()
       #print w,g
       for k in range(len(g)):
         if g[k]:
             w += ', '+g[k]
             print w
         else:
           break

s ='search for searing remarks that mark whether the ark came by sea'

重複するキーワードもすべて見つける必要があります。しかし、私の試みは

search, sea
search, sea, rch
search, sea, rch, ch
sear, sea
sear, sea, r
sea, sea

どのようにアプローチすればよいでしょうか。今日習ったばかりです。前もって感謝します

期待される結果: sea, sear, search for first 'search' searing は sear, and sea を生成します

4

2 に答える 2

1

おそらく、後読みアサーションを探しているでしょう。こちらをご覧ください

次のように、「r」および「ch」グループを最初のキャプチャ グループ内の非キャプチャ グループに変換する必要もあります (単語の境界が常にスペースであると仮定すると、これは簡単に一般化できます)。

p = re.compile("(sea(?:r(?:ch)?)?) ")

キーワードが常にプレフィックスのチェーンである場合は、文字列内の位置ごとに反復を行うことで時間を無駄にしています。プレフィックス形式を最大から最小に一致させたいだけです (つまり、最大のものから最初に一致します)。

p = re.compile("(search|sear|sea)")

次に、関数を使用して、より大きなプレフィックスを分割できます。

于 2013-09-18T06:55:02.380 に答える