Python中的负面后视RE

时间:2011-07-07 06:57:33

标签: python regex string-formatting

我无法在Python中编写负面的lookbehind RE。这些是一些示例字符串(我有超过80,000条文本消息):

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处理中获取它。血压值并不总是在最后(或者它可能不会出现在某些记录中),并且病房/床位值并不总是在开头。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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']