как получить строку и ее значение с помощью регулярного выражения - PullRequest
3 голосов
/ 13 июля 2020

Name        Miss deks KUMARI                    Booking Date           22/05/2020 
             Gender/Age  male  24 Yrs                        Reporting Date         22/05/2020 
             Lab No.     10203693                              Sample Collected At    Lab 
             Ref. By Dr. I.C.U 
                  ;                                                                          UVLO 
             Test Name                                  Value         Unit            Biological Ref Interval 
                                           COMPLETE   BLOOD   COUNT (CBC) 
             TOTAL LEUCOCYTES    COUNT (TLC)            23160         cells/cmm       4000 - 11000 
             DIFFERENTIAL LEUCOCYTES  COUNT (DLC) 
             NEUTROPHILS                                93.4          %               45.0 - 65.0 
             LYMPHOCYTES                                 3.3          %               20.0 - 45.0 
             MONOCYTES                                   3.1          %               4.0 - 10.0 
             EOSINOPHILS                                0.2           %               0.0 - 5.0 
             BASOPHILS                                   0.0          %               0.0-1.0 
             ABSOLUTE   NEUTROPHILS                      21620.0                      3000.0 - 7000.0 
             ABSOLUTE   LYMPHOCYTES                      750.0                        800.0 - 4000.0 
             ABSOLUTE  MONOCYTES                         730.0                        0.0 - 1200.0 
             ABSOLUTE  EOSINOPHILS                       50.0                         0.0 - 500.0 
             ABSOLUTE  BASOPHILS                         10.0                         0.0 - 100.0 
             RBC  COUNT                                  4.31         Millions/cmm    3.80 - 5.80 

это текстовый файл, и я хочу получить такой вывод с использованием регулярного выражения

, если я ищу NEUTROPHILS Я хочу его значение 93.4

если я ищу BASOPHILS я хочу его значение 0.0, что-то вроде этого.

нужны только первые два столбца, я пытался один раз реализовать регулярное выражение ^[^\S\r\n]*(\S+)[^\d\r\n]+(\d+(?:\.\d+)?)[^\d\r\n]*(\d+(?:\.\d+)?)?

, но он возвращает все

кто-нибудь, пожалуйста, помогите мне получить это

вот мой список

         `["NEUTROPHILS"                                
         "LYMPHOCYTES"                               
         "MONOCYTES"                                   
         "EOSINOPHILS"                               
         "BASOPHILS"]`             

я хочу получить вот так -:

{
 "NEUTROPHILS"  :  93.4                            
 "LYMPHOCYTES"  :  3.3                           
 "MONOCYTES"    :  3.1                             
 "EOSINOPHILS"  :  0.2                         
 "BASOPHILS"    :  0.0 }



Ответы [ 3 ]

3 голосов
/ 13 июля 2020

Вы можете использовать следующее выражение:

\b(?P<key>[A-Z][A-Z ]+)\b(?P<value>\d+(?:\.\d+)?)

Затем нам нужно очистить ключи (удалить ненужные пробелы) и подумать о функции, которая возвращает значение для данного ключа. Необязательно: поместите все в класс. Тем не менее, код может быть:

import re

class Finder:
    def __init__(self, haystack):
        self.db = self.build_db(haystack)

    def build_db(self, haystack):
        rx = re.compile(r'\b(?P<key>[A-Z][A-Z ]+)\b(?P<value>\d+(?:\.\d+)?)')
        ws = re.compile(r'\s+')

        return {ws.sub(' ', m["key"].strip()): m["value"] for m in rx.finditer(haystack)}

    def find_by_key(self, key):
        try:
            value = self.db[key]
        except KeyError:
            value = None
        return value

    def get_selected(self, lst):
        result = {}
        for key in lst:
            value = self.find_by_key(key)
            if value:
                result[key] = value
        return result

    def get_all(self):
        return self.db

cls = Finder(junk)
dct = cls.get_selected(["NEUTROPHILS", "LYMPHOCYTES", "MONOCYTES", "EOSINOPHILS", "BASOPHILS"])
print(dct)

, что даст

{'NEUTROPHILS': '93.4', 'LYMPHOCYTES': '3.3', 
 'MONOCYTES': '3.1', 'EOSINOPHILS': '0.2', 'BASOPHILS': '0.0'}

См. Демонстрацию выражения на regex101.com .

1 голос
/ 13 июля 2020

Для этого вы можете попробовать это простое регулярное выражение. Ваш 1-й столбец будет 0-й группой захвата, а 2-й столбец будет 1-й группой захвата: [A-Z]+\s+[A-Z]*\s+(\d+.\d*)

Объяснение вышеуказанного регулярного выражения:

  • Сначала он соответствует одному или нескольким заглавным буквам буквы
  • Затем соответствует одному или нескольким пробелам
  • Затем снова соответствует нулю или прописным буквам режима (чтобы закрыть ключи, разделенные пробелами в вашем тексте)
  • Последняя часть соответствует десятичной di git (s).

Вот демонстрация на regex101.com

Примечание: Это регулярное выражение можно легко улучшить до добавить дополнительные ограничения.

0 голосов
/ 13 июля 2020

Я уверен, что есть способы сделать это лучше. Но это то, что я делал в прошлом:

with open(file.txt) as file: 
  for line in file:
    remove_white_spaces=line.strip()
    search=re.search('^\w+\s+\d+',remove_white_spaces)
    if search != None: 
      extract=(search.string).split()
      print(extract[1])

Конечно, вы можете изменить поиск на реальное слово, если хотите. Я написал это полностью, однако с пониманием списка вы могли бы записать все это в 2 строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...