Отрицательный взгляд за RE в Python - PullRequest
1 голос
/ 07 июля 2011

Я не могу написать отрицательный взгляд за RE на Python. Вот некоторые из примеров строк (у меня есть более 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), а не кровяное давление. Я не могу написать отрицательное утверждение за утверждением, поскольку оно требует фиксированной длины. Вот мой RE:

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

Это не работает, так как у меня .* в негативном взгляде сзади .., пожалуйста, помогите мне в этом.

Редактировать: каждая запись пациента начинается с новой строки, и у меня есть эти записи в текстовом файле, который я получаю из обработки Hadoop. значение артериального давления не всегда в конце (или может не отображаться в некоторых записях), а значение прихода / койки не всегда в начале.

Ответы [ 2 ]

2 голосов
/ 07 июля 2011

Если артериальное давление всегда находится после вашего выражения, тогда просто переверните вашу идею и сравните, только если «bp» следует. На будущее можно иметь квантификаторы.

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

См. здесь, в 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]?)

Посмотрите это здесь на Regexr

0 голосов
/ 07 июля 2011

В следующем решении меня не интересуют числа 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']
...