2011-07-07 12 views
1

Pythonで否定的なlookbehind REを書くことができません。これらのサンプルはいくつかのサンプル文字列です(私は80,000以上のテキストメッセージをこのように持っています)。Pythonの否定的なlookbehind RE

 
patient 100/64 bp is 120/90 *some string* 
100H/64 patient bp 120/90 
location 100c/64 patient bp120/90 *some string* 
*some string* 100/64 patient *this string with no 'bp' value* 

ここで120/90は、患者の血圧を意味します。私はちょうど血圧ではなく、「病棟番号/ベッド番号」(例えば:100/64100H/64100c/64100/64)を抽出したいと思います。私はそれが固定長を必要とするので、負のlookbehindアサーションを書くことができません。ここに私のREは、次のとおりです。

(?<!bp.*)(\b[0-9]{1,3}[a-zA-Z]?)\/([0-9]{1,3}[a-zA-Z]?\b)

私は否定後読みに.*を持っているように、これは機能していません。これで私を助けてください。

編集:各患者レコードは改行で開始され、これらのレコードはHadoop処理から取得したテキストファイルに格納されています。血圧値は必ずしも終わりではない(または、一部の記録には現れないかもしれない)、病棟/ベッドの値は必ずしも始まりではない。

+0

わかりません。これらが別々の行であれば、最初のスペースまですべてを取得してみませんか?それはあなたのために働くでしょうか? – rajasaur

+0

私は突き刺しを編集しました、病棟/ベッドは常に始まりではありません。そのためには〜ありません – Maggie

+0

入力はリスト内の一連のpython文字列ですか?各患者の記録が新しい行を始める1つの文字列? Pythonの入力フォーマットを与えると、誰かがあなたのためにもう少しやり遂げることができます。 – Paddy3118

答えて

2

血圧が常に式の後にある場合は、「bp」がフォローされている場合にのみ、あなたのアイデアを回して一致させてください。ルックアヘッドのために、量子を持つことが許されています。

(\b[0-9]{1,3}[a-zA-Z]?)\/([0-9]{1,3}[a-zA-Z]?\b)(?=.*\bbp) 

(?=.*\bbp)文字列bpには、以下のことを保証肯定先読みを意味することにhere at Regexr

それを参照してください。

あなたは同じパターンがこの

(\b[0-9]{1,3}[a-zA-Z]?)\/([0-9]{1,3}[a-zA-Z]?\b)(?=.*[0-9]{1,3}[a-zA-Z]?\/[0-9]{1,3}[a-zA-Z]?) 

私は、次のソリューションでhere on Regexr

+0

申し訳ありませんが、常に真実ではなく、私は質問を編集しました。私は、病気や病床を血圧と区別するために「bp」を使います。とにかくクイックレスポンスに感謝します:) – Maggie

+0

@Mahin私は私の答えを更新しました。 – stema

+0

これは私の今の問題ですが、私は80,000のメッセージ全体を調べなかったので、この解決法がない場合、この解決法はその病棟/ベッドの値を守ることができません。奇妙な状況。ありがとう – Maggie

0

にそれを参照してくださいのような先読みで再び繰り返しているかどうかを確認だけで、その後、「BP」に中継することができない場合あなたがそれらをキャッチしたくないので、bp番号を気にしないでください。

この解決法の原則は、 'patient'という単語の前または後に '2000/478'または '312YXZ/17'のような文字列をキャッチすることです。
患者の番号付けが前後に「患者」という言葉なしで行われる場合、この解決法は機能しません。分析された文字列で発生する可能性のある症例についてさらに説明する必要があります。

import re 

ch = '''patient 101/10 bp is 120/90 *some string* 
297lol/27 patient 
308H/38 patient bp 120/90 
location 415c/45  patient bp120/90 *some string* 
*some string* 572/52 patient *this string with no 'bp' value* 
a 120/90 bp for 617E/67  patient at 12:32 
location 789k/79 bp120/90 *some string*''' 

pat = ('(patient[ \t]+)?(\d+[a-zA-Z]*/\d+)(?(1)|[ \t]+patient)') 

regx = re.compile(pat) 

print [mat.group(2) for mat in regx.finditer(ch)] 

結果、あなたが後読みを必要とする理由

['101/10', '297lol/27', '308H/38', '415c/45', '572/52', '617E/67'] 
関連する問題