python - 一次性为文本数据创建正则表达式?
问题描述
这是我的文本格式,我想将正则表达式传递到此数据中。
因为我创建了一个正则表达式,但它不起作用。
(\S+)\s+(\d+.\d+)|(\S+)\s+(=\d+.\d+)
它没有给我预期的输出:
此数据在TXT文件中,并且在单词开头之前有很多空格
我附上了我如何阅读 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
解决方案
您可以使用可选的第三组而不使用交替|
并检查它是否存在
^[^\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)
输出
{'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)
推荐阅读
- vega-lite - 在数据之间切换时重用 Vega-Lite 轴
- java - 如何在 JavaFX 应用程序上显示具有相对路径的图像?
- python - 从使用 Python 从 JavaScript/JSON 数组(POST 请求)加载数据的网站抓取数据
- c++ - 按字母顺序排列结构数组
- arrays - 为什么我不能使用模板文字在新对象中创建字符串作为键?
- angular - 从服务调用到组件时需要什么样的参数?ts(2554)
- python - Python多处理:将kwargs转发到actor函数
- c++ - 使用 zigzag 扫描将 8x8 矩阵转换为展平向量
- python - 日内每日回报
- sql-server - 加速 SQL Server 中数十亿条记录的更新?