2016-08-01 23 views
3

特定の単語の1つが別の特定の単語で終わらない場合は、そのままにしておきます。ここに私の文字列は次のとおりです。指定された文字列内の2つの特定の単語の間の単語を印刷する

x = 'john got shot dead. john with his .... ? , john got killed or died in 1990. john with his wife dead or died' 

私はjohndied or dead or deathのいずれかのワードで終わらない場合johndead or death or died. 間のすべての単語を印刷してカウントします。それを残す。ジョンの言葉でやり直してください。

私のコード:

x = re.sub(r'[^\w]', ' ', x) # removed all dots, commas, special symbols 

for i in re.findall(r'(?<=john)' + '(.*?)' + '(?=dead|died|death)', x): 
    print i 
    print len([word for word in i.split()]) 

私の出力:私はしたい

got shot 
2 
with his   john got killed or 
6 
with his wife 
3 

出力:

got shot 
2 
got killed or 
3 
with his wife 
3 

私は間違いをしています。ここで、iは知りません。 これは単なるサンプル入力です。私は20,000の入力を一度にチェックしなければならない。

+0

あなたのポイントが明確ではありません。彼のジョンが殺されたか、ジョンの言葉の後に来るので、6と計算されますか? –

+0

@MarlonAbeykoon 'ジョンと彼の....?ジョンが殺された、または死んでしまった」という第1のジョンの言葉は、「死んでいるか死んでいるのか死んでいるのか」という言葉はありません。第2の「ジョン」単語から始める。私が欲しいと思っているのは、彼のジョンが殺されてしまった、または殺されたということです。 –

答えて

2

あなたはこの負の先読み正規表現を使用することができます。

私はまた、完全な単語を一致させるために、単語の境界を使用することをお勧め:

re.findall(r'(?<=\bjohn\b)(?:(?!\bjohn\b).)*?(?=\b(?:dead|died|death)\b)', x) 

Code Demo

+1

私の解決策よりもずっと上品で、これを取る。 – jbndlr

+1

これは私のすべての入力に優れています。ありがとう。 –

2

dead|died|deathが発生する前に、あなたの文字列に別のjohnがある場合は、最初からやり直したいと思います。

その後、あなたは言葉johnして文字列を分割し、その後結果の部分にマッチングを開始することができます

x = 'john got shot dead. john with his .... ? , john got killed or died in 1990. john with his wife dead or died' 
x = re.sub('\W+', ' ', re.sub('[^\w ]', '', x)).strip() 
for e in x.split('john'): 
    m = re.match('(.+?)(dead|died|death)', e) 
    if m: 
     print(m.group(1)) 
     print(len(m.group(1).split())) 

利回り:

got shot 
2 
got killed or 
3 
with his wife 
3 

また、交換した後、私はここに提案することに注意してください(分割とマッチングする前に)、文字列は次のようになります。

john got shot dead john with his john got killed or died in 1990 john with his wife dead or died 

つまり、シーケンス内に複数の空白が残っていません。後でホワイトスペースで分割することでこれを管理しますが、これはちょっときれいだと思います。代わりにあなたの.*?

>>> for i in re.findall(r'(?<=john)(?:(?!john).)*?(?=dead|died|death)', x): 
...  print i.strip() 
...  print len([word for word in i.split()]) 
... 

got shot 
2 
got killed or 
3 
with his wife 
3 

この正規表現は(?:(?!john).)*?を使用しているjohnは、この試合に存在しない場合にのみ、いい加減に任意の文字の0回以上にマッチします:

+0

良い解決策ですが、最初のジョンまでパートにとってはうまくいかないでしょう。 [1:]スライスを追加してください: –

+1

文が '... dead john'で始まる場合(つまり、最初の' john'の前に何か、3つのストップワードのうちの1つが含まれています)、それはそれをマッチとして扱います。私はそれを修正します。ありがとうございます。 – jbndlr

+0

これも素晴らしいです。 –

関連する問題