2011-07-07 47 views
1

我無法在python中寫負向後視RE。這些是一些示例字符串(我有超過80,000條這樣的文本消息);python中的負向後視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/64,100H/64,100c/64,100/64)而不是血壓。由於它需要固定長度,因此我無法寫出否定後向斷言。這裏是我的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字符串在列表中?一個字符串與每個患者記錄開始一個新行?如果你給Python輸入格式,有人可以爲你做更多的事情。 – Paddy3118

回答

2

如果血壓始終在您的表達之後,那麼只需要在您遵循「bp」的情況下轉動您的想法並匹配。爲了展望未來,它允許有量詞。

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

查看它here at Regexr

這意味着

(?=.*\bbp)正超前,其確保在字符串bp以下。

如果你不能在「BP」接力然後只檢查是否相同的模式再次在前瞻重複這樣

(\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條消息,所以如果一些沒有'bp'值的消息這個解決方案將無法捕捉到病房/牀價值儀式......任何解決這些問題的建議奇怪的情況。謝謝 – Maggie

0

在下面的解決方案,我不關心bp數字,因爲你不想捕捉它們。

該解決方案的原理是在「患者」這個單詞前或後跟上一個像'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']