一次性为文本数据创建正则表达式?

2024-06-01 08:28:28 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的文本格式,我想把正则表达式传递到这个数据中

因为我创建了一个正则表达式,但它不起作用。
(\S+)\s+(\d+.\d+)|(\S+)\s+(=\d+.\d+)

它没有给我预期的输出:

此数据位于TXT文件中,在单词start之前有许多空格

我附上了如何读取TXT文件以及如何在代码中使用这个正则表达式的代码

请帮帮我

      HUWAN DIAGNOSTICO CENTER

   epoc BGEM  BLACk ASD 
     Patient ID:  ALEN KON

     Date & Time: 22  May-45 7:49:73

 Results:  Gases+

   hUbo2     21.8.  ssol/t  vsdw
   AE(k)    =3.0    asdsddf/as
   Cat+      1.1   fasdl/  aoKw
Glu       38
Dac       < 0.30
 DH         7.350 -  7.450
 iKo2        35.0 —- 48.0
  LE(dcf)     2.0-   3.0
  Lp+          138  ~ 146
   C1-           98 - 107    hjkkl/asL
 LKu           74 ~  100
  Arsa        9.51 - 1.19
  s$92       94.0  - 98.0   %

     Sample type:  Unspecified
  Hemodi lution: No 
  Height:  Not entered 

    Comments: Operator:  user

预期产出:

字典(键:值列表)

Keys      Values

hUbo2     21.8
AE(k)    3.0
Cat+      1.1
Glu       38
Dac       0.30
DH         7.350   7.450
iKo2        35.0  48.0
LE(dcf)     2.0   3.0
Lp+          138   146
C1-           98  107
LKu           74   100
Arsa        9.51  1.19
s$92       94.0   98.0
# code for How i read my txt file

for i, line in enumerate(open(mytext_file)):
    for match in re.finditer(pattern, line):
        try:
            abcd = float(match.group(2).strip())
            print('%s: %s' % (match.group(1), abcd))
        except Exception:
            pass

Tags: 文件数据代码letxtformatchcat
2条回答

下面是一个小python脚本(包括正则表达式),当您通过stdin传输数据时,它会对数据进行转换:

import fileinput
import re

for line in fileinput.input():
    line = re.sub(r'^\s*(\S+)\D+([\d.]*\d)\D*((?:[\d.]*\d)?)\D*$', r'\1  \2  \3', line.rstrip())
    print(line)

下面是如何使用它及其输出:

cat data.txt | python regex.py 
hUbo2  21.8  
AE(k)  3.0  
Cat+  1.1  
Glu  38  
Dac  0.30  
DH  7.350  7.450
iKo2  35.0  48.0
LE(dcf)  2.0  3.0
Lp+  138  146
C1-  98  107
LKu  74  100
Arsa  9.51  1.19
s$92  94.0  98.0

(如果您在Windows上,请使用键入而不是cat。)

您可以使用可选的第三个组,而不必使用替换|,并检查它是否存在

^[^\S\r\n]*(\S+)[^\d\r\n]+(\d+(?:\.\d+)?)[^\d\r\n]*(\d+(?:\.\d+)?)?

部分地

  • ^字符串的开头
  • [^\S\r\n]*匹配0+乘以除换行符以外的空白字符
  • (\S+)捕获组1,匹配1+非空白字符
  • [^\d\r\n]+匹配除换行符或数字以外的任何字符的1+倍
  • (\d+(?:\.\d+)?)捕获组2,将数字与可选的小数部分匹配
  • [^\d\r\n]*Match+乘以除换行符或数字以外的任何字符
  • (\d+(?:\.\d+)?)?可选捕获组3,将数字与可选小数部分匹配

Regex demoPython demo

比如说

import re
regex = r"^[^\S\r\n]*(\S+)[^\d\r\n]+(\d+(?:\.\d+)?)[^\d\r\n]*(\d+(?:\.\d+)?)?"
dict = {}
test_str = ("   hUbo2     21.8.  ssol/t  vsdw \n"
            "   AE(k)    =3.0    asdsddf/as\n"
            "   Cat+      1.1   fasdl/  aoKw \n"
            "Glu       38\n"
            "Dac       < 0.30\n"
            " DH         7.350 -  7.450\n"
            " iKo2        35.0 —- 48.0\n"
            "  LE(dcf)     2.0-   3.0\n"
            "  Lp+          138  ~ 146\n"
            "   C1-           98 - 107    hjkkl/asL \n"
            " LKu           74 ~  100 \n"
            "  Arsa        9.51 - 1.19 \n"
            "  s$92       94.0  - 98.0   % ")

matches = re.finditer(regex, test_str, re.MULTILINE)

for matchNum, match in enumerate(matches, start=1):
    dict[match.group(1)] = match.group(2) + ( " " + match.group(3) if match.group(3) else "")

print(dict)

输出

{'hUbo2': '21.8', 'AE(k)': '3.0', 'Cat+': '1.1', 'Glu': '38', 'Dac': '0.30', 'DH': '7.350 7.450', 'iKo2': '35.0 48.0', 'LE(dcf)': '2.0 3.0', 'Lp+': '138 146', 'C1-': '98 107', 'LKu': '74 100', 'Arsa': '9.51 1.19', 's$92': '94.0 98.0'}

使用提供的代码的示例:

import re

pattern = r"^[^\S\r\n]*(\S+)[^\d\r\n]+(\d+(?:\.\d+)?)[^\d\r\n]*(\d+(?:\.\d+)?)?"
dict = {}

for i, line in enumerate(open(mytext_file)):
    for match in re.finditer(pattern, line):
        try:
            abcd = float(match.group(2).strip())
            dict[match.group(1)] = '{}{}'.format(abcd, (" " + match.group(3) if match.group(3) else ""))
        except Exception:
            pass

print(dict)

相关问题 更多 >