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+)?)?
部分地
字符串的开头^
匹配0+倍的空格字符,换行符除外[^\S\r\n]*
捕获组1,匹配1+非空白字符(\S+)
匹配除换行符或数字以外的任何字符的1+倍[^\d\r\n]+
捕获组2,将数字与可选小数部分匹配(\d+(?:\。\d+)
匹配+乘以除换行符或数字以外的任何字符[^\d\r\n]*
可选捕获组3,将数字与可选小数部分匹配(\d+(?:\。\d+)?
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