我无法在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/64
,100H/64
,100c/64
,100/64
)而不是血压。我无法编写负面的lookbehind断言,因为它需要固定的长度。这是我的RE:
(?<!bp.*)(\b[0-9]{1,3}[a-zA-Z]?)\/([0-9]{1,3}[a-zA-Z]?\b)
这不起作用,因为我在负面的背后有.*
..请帮助我。
编辑:每个患者记录都以新行开头,我将这些记录放在一个文本文件中,我从Hadoop处理中获取它。血压值并不总是在最后(或者它可能不会出现在某些记录中),并且病房/床位值并不总是在开头。
答案 0 :(得分:2)
如果血压始终在你的表达之后,那么只需转动你的想法并且仅在跟随“bp”时才匹配。为了展望未来,它可以有量词。
(\b[0-9]{1,3}[a-zA-Z]?)\/([0-9]{1,3}[a-zA-Z]?\b)(?=.*\bbp)
这意味着
(?=.*\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]?)
答案 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']