python - 使用 Python 提取文本文件中两个字符串之间的文本数据
问题描述
假设我有一个包含以下内容的文本文件:
Quetiapine fumarate Drug substance This document
Povidone Binder USP
This line doesn't contain any medicine name.
This line contains Quetiapine fumarate which shouldn't be extracted as it not present at the
beginning of the line.
Dibasic calcium phosphate dihydrate Diluent USP is not present in the csv
Lactose monohydrate Diluent USNF
Magnesium stearate Lubricant USNF
Lactose monohydrate, CI 77491
0.6
Colourant
E 172
Some lines to break the group.
Silicon dioxide colloidal anhydrous
(0.004
Gliding agent
Ph Eur
Adding some random lines.
Povidone
(0.2
Lubricant
Ph Eur
我有一个 csv,其中包含我想在 .txt 文件中匹配的药物名称列表,并提取 2 个唯一药物之间存在的所有数据(当药物名称位于行首时)。(药物示例从 csv 文件是'Quetiapine fumarate', 'Povidone', 'Magnesium stearate', 'Lactose monohydrate' etc etc.)
我想迭代我的文本文件的每一行并创建从一种药物到另一种药物的组。
仅当药物名称出现在换行符的开头并且不在行之间时才会发生这种情况。
预期输出:
['Quetiapine fumarate Drug substance This document'],
['Povidone Binder USP'],
['Lactose monohydrate Diluent USNF'],
['Magnesium stearate Lubricant USNF'],
[Lactose monohydrate, CI 77491
0.6
Colourant
E 172],
[Povidone
(0.2
Lubricant
Ph Eur]
有人可以帮我在Python中做同样的事情吗?
尝试到现在:
medicines = ('Quetiapine fumarate', 'Povidone', 'Magnesium stearate', 'Lactose monohydrate')
result = []
with open('C:/Users/test1.txt', 'r', encoding='utf8') as f:
for line in f:
if any(line.startswith(med) for med in medicines):
result.append(line.strip())
它将输出捕获到这里,但我还需要其余部分:
['Quetiapine fumarate Drug substance This document'],
['Povidone Binder USP'],
['Lactose monohydrate Diluent USNF'],
['Magnesium stearate Lubricant USNF']
我需要捕获从一种药物到另一种药物的所有文本,如预期输出中所示。如果一行中只有一个药物名称,我需要从接下来的四行中捕获数据并形成一个组,其中一个数字将出现在药物之后的下一行中,如输出所示。
解决方案
您可以将此正则表达式与以下re.M
选项一起使用:
^\s*(?:Quetiapine fumarate|Povidone|Magnesium stearate|Lactose monohydrate).*(?:\n[^\w\n]*\d*\.?\d+[^\w\n]*(?:\n.*){2})?
查看正则表达式演示
细节
^
- 一行的开始\s*
- 0 个或多个空格(?:Quetiapine fumarate|Povidone|Magnesium stearate|Lactose monohydrate)
- 你的药物清单.*
- 线路的其余部分(?:\n[^\w\n]*\d*\.?\d+[^\w\n]*(?:\n.*){2})?
- 一个可选的字符串\n
- 新队[^\w\n]*
- 除单词和换行符之外的 0+ 个字符\d*\.?\d+
- 一个号码[^\w\n]*
- 除单词和换行符之外的 0+ 个字符(?:\n.*){2}
- 出现两次换行符和行的其余部分
Python(参见Python 在线演示):
import re
medicines = ['Quetiapine fumarate', 'Povidone', 'Magnesium stearate', 'Lactose monohydrate']
result = []
med = r"(?:{})".format("|".join(map(re.escape, medicines)))
pattern = re.compile(r"^\s*" + med + r".*(?:\n[^\w\n]*\d*\.?\d+[^\w\n]*(?:\n.*){2})?", re.M)
with open('C:/Users/test1.txt', 'r', encoding='utf8') as f:
result = pattern.findall(f.read())
推荐阅读
- javascript - Nodemailer - 动态传输器
- javascript - 如何从外部进程更新数据?
- django - 如何使用“或”语句创建查询集
- vue.js - Vue 计算和方法在调用时具有不同的行为
- delphi - RESTRequest 在使用 HMRC 税务平台时返回错误
- matlab - 用 fft 从信号中去除频率
- mongodb - 带有 Raspberry Pi 的廉价 MongoDB 副本集,它不会减慢主实例的速度
- php - WP_Query 使用 's' 和 tax_query 不起作用 (Woocommerce)
- javascript - ANTD动态形式-初始值
- azure - 如何使用逻辑应用将 Azure SQL 数据库中的大表导出为 CSV