Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 一次性为文本数据创建正则表达式?_Python_Regex - Fatal编程技术网

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

Python 一次性为文本数据创建正则表达式?,python,regex,Python,Regex,这是我的文本格式,我想把正则表达式传递到这个数据中 因为我创建了一个正则表达式,但它不起作用。 (\S+)\S+(\d+。\d+)|(\S+)\S+(=\d+。\d+) 它没有给我预期的输出: 此数据位于TXT文件中,在单词start之前有许多空格 我附上了如何读取TXT文件以及如何在代码中使用这个正则表达式的代码 请帮帮我 HUWAN DIAGNOSTICO CENTER epoc BGEM BLACk ASD Patient ID: ALEN KON

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

因为我创建了一个正则表达式,但它不起作用。
(\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

您可以使用可选的第三组,而无需使用替代项
|
,并检查是否存在该组

^[^\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]*
    匹配+乘以除换行符或数字以外的任何字符
  • (\d+(?:\。\d+)?
    可选捕获组3,将数字与可选小数部分匹配
|

比如说

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)
使用提供的代码的示例:

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)

下面是一个小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上,请使用type而不是cat。)

可能使用可选的第三组
^[^\S\r\n]*(\S+)[^\d\r\n]+(\d+(?:\.\d+))[^\d\r\n]*(\d+(?:\.\d+)?
此部分
^[^\S\r\n]*
在开始时匹配0+个空格。您可以将其更改为
^[^\S\r\n]+
用于1个或多个,或
^[^\S\r\n]{2,}
用于2个或多个等。我刚刚尝试过,它返回空字符串`r“^[^\S\r\n]{2,}(\S+)[^\d\r\n]+(?:\.\d+)[^\d\r\n]*(\d+)(\d+)(\d+)*(\d+)*(\d+)(\d+)?:\.-)?)?。?)??)??“?”如果我在正则测试仪中使用此模式,我看到它与以2个或更多空格开头的行匹配空格前没有数据,对吗?您是否使用了re.MULTILINE?量词的数字无关紧要。您可以将文件的文本添加到此链接,更新它并将更新后的链接粘贴到此处的注释中吗。您可以通过将
添加到否定字符类来排除日期部分的匹配,但我仍然得到相同的匹配项。您如何读取文件?一行一行,还是一次完成整个文件?你根本没有找到匹配的吗?也许您可以将您使用的代码添加到问题中。
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