2017-03-27 1 views
0

式の連続するインスタンスに一致する正規表現を作成しようとしていますが、テキストがその式で始まる場合のみです。テキストの先頭から連続して繰り返すグループを一致させる

たとえば、数字の後ろに単語「\d \w+」があるとします。

1ワード2つの文字いくつかのより多くの単語3グループ

私は2つのグループを取得したい:行で始まるので、「1つの単語」と「2つの文字を」テキストについては
(数字と単語 - 「1単語」)、直後に別の単語(「2文字」)が続きます。しかし、私はそれが "3つのグループ"と一致することを望んでいません。テキストについては

ABC 1つのワード3つの文字

それが "ABC" で始まるので、何のグループが一致していないはずです。

ありがとうございます!

+2

あなたは私たちがあなたのためにいくつかのコードを書きたいように見えます。多くのユーザーは、苦労しているコーダーのコードを作成したいと考えていますが、通常は、ポスターがすでに問題を解決しようとしているときにのみ役立ちます。この作業を実証するには、これまでに書いたコード([mcve]の作成)、サンプル入力(あれば)、期待される出力、実際に出力するもの(出力、トレースバック、等。)。あなたが提供する詳細があれば、受け取る可能性の高い回答が増えます。 [ツアー]と[質問]を確認します。 – TigerhawkT3

+0

リンクされた質問の一番上の答えを確認し、量子( '+')とグループ( '(?:...)')を見てください。 – TigerhawkT3

+0

ああ!あなたは眠っているのですか?私はあなたの質問に信じられないほどの答えをし、それが閉じないようにして、あなたは眠っていますか?コメントなし、upvote、no downvote? <°)))))))> –

答えて

0

reモジュールでは、 "pure regex"では実行できません。しかし、あなたはそれぞれの結果の開始インデックスをチェックするre.finditerメソッドを使用することができます。

import re 

s = '1 word 2 letters some more words 3 groups' 

def getFromStart(p, s): 
    index = 0 
    for m in re.finditer(p, s): 
     if m.start() == index: 
      yield m 
      index = m.end() 
     else: 
      raise StopIteration 

print([m.group(1) for m in getFromStart(r'(\d \w+)\s*', s)]) 

他の方法は、reモジュールを使用し、利用可能な\Gアンカーを持ってregexモジュールをインストールしないでください。このアンカーは、前の結果の後の位置(デフォルトでは文字列の開始位置)に一致します。それにパターンを起動すると、連続した試合は、文字列の先頭から連続していることを保証します:

import regex 

s = '1 word 2 letters some more words 3 groups' 

print(regex.findall(r'\G(\d \w+)\s*', s)) 
関連する問題