使用熊猫的优雅正则表达式 - 提取剂量信息

时间:2021-03-31 06:49:08

标签: python regex pandas string dataframe

我有一个如下所示的数据框

df = pd.DataFrame({'text_1':['WHITE SOFT PARAFFIN 100G', 'VITAMIN B12 1MG/ML INJ 10ML','vitamin B1 100mg, B6 200mg, B12 200mcg tab','UREA CREAM 10% BP 100G', 'TOBRAMYCIN 0.3%/DEXA 1% EYE DROP 5ML','TERAzosin 5MG TAB (HYTRIN)','SODIUM CHLORIDE 0.9% EYE DROP 5ML/10ML']})

我想从示例数据框中显示的药物列表中提取剂量信息。

虽然我能够达到 90% 的准确率,但我想与您核对一下如何以万无一失的方式或以稳健的方式最大限度地减少捕获不需要的信息

例如,我尝试了下面的方法,但它产生了错误的输出

df['text_1'].str.findall('[0-9]+\s*[mgMG/lLcC]+')

enter image description here

最后一行应该是 5ML/10ML 但它被分成了两部分(这是不正确的)

另一个提示是我知道我的所有剂量值都以 number optionally followed by a space and unit like MG, MCGMLGg、{{1} }、mgmcg

例如:ml,我想提取WHITE SOFT PARAFFIN 100G。同样,对于 100G,我想提取 VITAMIN B12 1MG/ML INJ 10ML。我们提取 1MG/ML and 10ML1MG/ML 因为它满足我的提示

所以,我希望我的输出如下

enter image description here

1 个答案:

答案 0 :(得分:1)

怎么样

df.text_1.str.findall(r"\d+\s*[mc]*[lg]+/*(?:\d*\s*[mc]*[lg]+)?", flags=re.IGNORECASE)

输出:

0                    [100G]
1            [1MG/ML, 10ML]
2    [100mg, 200mg, 200mcg]
3                    [100G]
4                     [5ML]
5                     [5MG]
6                [5ML/10ML]
Name: text_1, dtype: object

关于正则表达式:

  • 我们至少需要一些数字:\d+

  • 空格是可选的 \s*

  • 可能有 mc 之类的前缀[mc]*

  • 真正的单位应该在那里[lg]+

  • 这些 /*

    末尾的斜线是可选的

第二部分稍微修改了一下,具体

  • 斜杠后可能有也可能没有数字,即\d*
  • 这整个部分是可选的?
  • 并且不被捕获?:

我们使用不区分大小写的方式来从 M 等中节省一些空间