2011-09-12 16 views
3

私は正規表現のパターンを持っています。これは大量のテキスト(1つの文字列)で使用しました。元のテキストのいくつかの不連続な領域が正規表現にマッチします。今、私はステートマシンを構築しようとしています、テキストを反復して、ある位置のcharに基づいて、そしてこの位置が正規表現マッチの範囲内にあるかどうかに基づいて、Python regex:文字列中の文字が正規表現にマッチした部分文字列の範囲内にあるかどうかをチェックする方法?

RE.finditer(text)を使用すると、すべての部分文字列を見つけることができ、範囲を抽出できます。したがって、タプルのリストがあります。

(1、5) (10、15) (20、55)、 など

この情報を使用して、私の文字列内の文字のインデックスを考えると、私は見るためにアルゴリズムを書くことができますその文字が正規表現文字列の一部である場合。たとえば、文字6を指定すると、スパンのリストを調べて、一致する部分文字列の一部ではないと判断できます。

これを行うには良い方法がありますか?事前に

おかげで、

JW

+0

あなたが(otehrものの中で)トークン化するパーサーFSMを書いているようですそれらがエスケープされていない場合にのみ、文法だけでなく自分のステートマシンを書こうと思っていますか?* antlr/lex *がFSMを作成しますか? – smci

+0

ちょっと、私のレキシ/ yaccはちょっとファジーです:)。 – wk1989

+0

必要なものすべてがエスケープされたカンマを識別子の中にマッチさせる正規表現だった場合、パーサFSMを書く必要はありません。今度は、 'bbbb /、ccccc' *のすべてを1つのトークン、または3つのものとして取り込みたいのですか? – smci

答えて

1

EDIT:あなたは彼らがエスケープされていないときにのみ、コンマ文字をトークン化(とりわけ)、独自のパーサFSMを書きたいように聞こえます。 次の正規表現は、エスケープされたコンマを含む可能性のある識別子に対して機能します。

input = r'aaaaa,bbbb/,ccccc,dddddd,' 

pat = re.compile(r'((\w+|/,)+)') 

for mat in re.finditer(pat, input): 
    ... do stuff with mat.group(0) 

(オリジナルの答え:あなたはANTLR/LEXでこれを使用することができます。 良い解決策かもしれないが、あなたは私たちに伝えるために十分なコンテキストを与えていない

文字を発生し一度だけ出現する場合は、string.find(char)のインデックスが正規表現マッチの範囲内にあるかどうかを確認することができます。

文字は任意の文字ですか - 具体的な例を教えてください なぜy文字単位でこれをやっていますか?おそらく、複数の文字を順番にチェックしていないのでしょうか?

希望の結果がブール型ですか('はい、正規表現一致のスパンの内側に' char 'が見つかりました')?正規表現のマッチの外側でcharが見つかった場合はどうすればよいでしょうか? ,を逃れ

+0

私は、文字列を繰り返し処理し、文字が何であるかに基づいて特定のアクションを実行するステートマシンを持っています。また、文字が正規表現マッチの一部であるかどうかも関係ありません。例えば、文字が "、"で、正規表現にマッチした部分文字列の一部ではない場合(つまり、特定の正規表現にマッチした部分文字列内にあれば '、'をすべて無視したい)。だから私は、同じ文字の複数のインスタンスを扱うし、それらのそれぞれが正規表現に一致する部分文字列の一部であるかどうかを知る必要があります。これは、これをクリアすることを願って、ありがとう。 – wk1989

+0

まだコンテキストが十分ではありません。 **文字列の入力と出力の具体的な例を投稿してください。**なぜあなたは一般化された状態マシンを書くのですか?これはあなたの目標か、あなたが選んだ実装ですか? **正規表現マッチに対してコンマ文字をマッチさせようとしている理由は何ですか?解決すべき特定の問題は何ですか? – smci

+0

マッチするignoreCharsの範囲だけを無視したい場合は、必ず 'string.translate(... deleteChars)'をそれらに適用しますか? – smci

1

編集 ここでは無視して,間のテキストをつかむだろう正規表現です:

ここ
(?=<,)(?:[^,]|(?=</),)(?=,) 

オリジナル回答 は、あなたが探している何をすべきいくつかの擬似Pythonコードです:

pattern = re.compile(...) 
pos = 0 

while (match = pattern.search(haystack, pos)) { 
    for (i in range(pos, match.start) 
    //These chars are outside the match. 

    for (i in group(0)) 
    //The chars are in the match 

    pos = match.end 

//Finish with the rest of the chars not matched 
for (i in range(pos, len(haystack)) 
    //These chars are outside the match. 
+1

' haystack'をキャッチしますか?それはsoooo PHPです – NullUserException

関連する問題