として、私は単語のリストの形で文章を持って、例えば正規表現の入力
は今、私は条件節['if', 'it', 'will', 'rain']
を見つけるしたいと思います。原則として、文から文字列を作成することができます。 s = ' '.join(sentence)
は、Iおよび正規表現を使用して:正規表現を判断する
p = re.compile(r'(\bif\b[a-zA-z0-9\'\s]+)\s*(,*)\s*(then|,)')
for m in p.finditer(s):
print m.start(1), m.end(1), '['+s[ m.start(1) : m.end(1) ]+']'
必要はありません、それだけですぐに:)にスケッチしています。これは私に出力を与える:0 16 [if it will rain ]
これまでのところとても良い。しかし、今私は、私のorignalリストへの接続が見当たりません。正規表現は私に文字の位置を与え、単語/トークンの位置は与えません。理想的には、私は0と3を得るので、条件節がsentence[0:3]
であることが分かります。私は、文字の位置を対応するリストインデックスにマップするメソッドを書くことができると確信していますが、すべてこれを行う方が良いと確信しています。
もちろん、正規表現を無視して、リストをループして、適切な開始条件と終了条件を考え出すことができます。しかし、現在のレギュラーは、要求された条件を明示的にするために「隠す」ため、現在はむしろきれいに見える。彼らはまた、例えば、条件節が他の単語やフレーズによって示される場合を簡略化:
sentence = ['as', 'long', 'as', 'it', 'will', 'rain', ',', 'I', 'will', 'stay', 'at', 'home']
簡単ループを用いたもう少し迷惑な、正規表現でこれを反映するために、私が想定しています。
EDIT:非常に簡単な解決策は、実際にそこにないことを見て、私は正規表現と元の単語リストの文字列としての文との間のマッピングを作成するための私の考えを先に行ってきました:
def join(self, word_list, separator=' '):
mapping = []
string = separator.join(word_list)
for idx, word in enumerate(word_list):
for character in word:
mapping.append(idx)
for character in separator:
mapping.append(idx)
return string, mapping
で、私の入力にstring, mapping = join(sentence)
結果をこの方法を適用する:正規表現がマッチの範囲として私0
と16
を与えた場合、
mapping = [0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9]
今、私は元sentence
リーにインデックスを調べることができますstはmapping[0] = 0
とです。これまでのところ、これはかなりうまくいくようです。そして、私は試合をするために、文字列の正規表現を使用するので、私は簡単に条件節の代替製剤をサポートすることができ、例えば:
CONDITIONAL_PHRASES = ['if', 'as long as', 'even if']
...
p = re.compile(r"((%s)\s+[a-zA-z0-9'\s]+)\s*(then|,)" % '|'.join(CONDITIONAL_PHRASES))
、私は正規表現はすでに完璧であることを言っていないんだけど、それはサポートしています条件文のための異なるインジケータワードを含む複数のセンテンス。
あなたはどこまで行きたいのかによって異なりますが、あなたはパーサー領域の途中にあります。したがって、パーサーベースのソリューションに切り替えると、より強固な基盤が得られる可能性があります。 – mkiever
私はPythonを話しません;)しかし、速いgoogleは、 'sentence.index( '、')'を実行する方が良いのではないかと思うし、 'sentence.index( 'then')' 。そうでなければ、 'cond_end_idx =(iの場合はi、itemは列挙する項目が一致すれば '(then |、)'、item))' – ClasG
は 'if'あなたの 'sentence'に'、 'または' then'? – rock321987