0

次の形式が混在する構造を持つ文字列の下限値と上限値をフェッチする必要があります。

Rules:
1. If lower and upper range is available then they are separated by '-'. 
2. Sometimes the range is written as <=xx.y

2a. If 'less than' is anywhere in the text then search for the number. pl. see Example below:

3. If at all age range appears then it appears always before the range, separated from range by a ':'
4. the unit is optional

サンプルデータ

10.0 - 35.0 MCG/ML
<=6.0 MG/24 H
51-60 YEARS: 37-129
15 - 60
0.5-9.9 %
LESS THAN 30 PG/ML
LESS THAN OR EQUAL 35 UG/DL
LESS THAN OR EQUAL TO 35
NEGATIVE: LESS THAN 20
REF RANGE LESS THAN 2.0
1.3 OR LESS PMOL/L
LAR: LESS THAN 1 NG/M

上記のサンプルから、私の出力は次のようになります。

10.0,35.0, MCG/ML
0, 6.0, MG/24 H
37, 129,
15,60
0.5, 9.9, %

編集:

the string is in 'refVal'
re.search(r'([0-9]*\.?[0-9]*)\s*-\s*([0-9]*\.?[0-9]*)', refVal)
re.search(r'(<=|<|<\s*=|<\sOR\s=)\s*([0-9.]+)', refVal)

上記の例にいくつかの例を追加しました (特に未満の場合)。「未満」がテキストに含まれている場合に値を取得する正規表現を書きたいです。

以下は、不要な「なし」を提供します。

>>> re.search(r'([0-9.]+) OR LESS|LESS THAN ([0-9.]+)', '5.4 OR LESS').groups()
('5.4', None)
4

1 に答える 1

2

IMO では、正規表現だけでは信頼できるソリューションは得られません。私だったら、複数の条件と正規表現に分解します。そうは言っても、たわごととにやにや笑いのために私はこれを思いつきました...上記のすべてに一致しますが、それはかなり醜いです。まず、データはフォーマットに応じて異なるグループにキャプチャされます...

(?(?=.*:).*:\s*([0-9.]+)\s*-\s*([0-9.]+)|(?(?=.*\<=)(.*?)<=\s*([0-9.]+)\s*(.*)|([0-9.]+)\s*-\s*([0-9.]+)\s*(.*)))
于 2013-01-28T15:31:01.073 に答える