首页 > 解决方案 > 使用 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']

我需要捕获从一种药物到另一种药物的所有文本,如预期输出中所示。如果一行中只有一个药物名称,我需要从接下来的四行中捕获数据并形成一个组,其中一个数字将出现在药物之后的下一行中,如输出所示。

标签: pythonregexpython-3.xstring

解决方案


您可以将此正则表达式与以下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())

推荐阅读