python 正则表达式匹配仅当组在特殊字符之间时

python regex matching only if the groups are between a special character

我正在使用一些药物的数据框,我想从产品描述中的完整句子中提取剂量。

我想要的示例:

Dexamethasonacetat 5 mg/10 mg, Lidocain-HCl 1H2O 30 mg/60 mg
#['5mg/10mg','30mg/60mg']

Anakinra 120 mg /-20 g /-12mg gentechnologisch hergestellt aus E. coli. 10mg pack
#['120mg/20g/12mg']

我可以使用 \d+(?:[.,]\d+)*\s*(g|mg|) 提取剂量,这让我:

Dexamethasonacetat 5 mg/10 mg, Lidocain-HCl 1H2O 30 mg/60 mg
#['5mg','10mg','30mg','60mg']

Anakinra 120 mg /-20 g /-12mg gentechnologisch hergestellt aus E. coli. 10mg pack
#['120mg','20g','12mg','10mg]

如果/只发生一次,这样做会更容易,但它可以发生多次..

您可以使用一种模式来获得这些匹配项,然后对其进行处理以删除空格和连字符

-?\b\d+(?:[.,]\d+)*\s*m?g(?:\s*/\s*-?\d+(?:[.,]\d+)*\s*m?g)+\b

说明

  • -? 匹配一个可选的连字符
  • \b 防止部分单词匹配的单词边界
  • \d+(?:[.,]\d+)* 匹配 1+ 个带可选小数部分的数字
  • \s*m?g 匹配可选的空白字符,可选的 mg
  • (?:非捕获组整体重复
    • \s*/\s* 在可选空白字符之间匹配 /
    • -?\d+(?:[.,]\d+)*\s*m?g 匹配与之前相同的数字模式
  • )+关闭非捕获组并重复1+次以匹配至少一个带有正斜杠的部分
  • \b一个单词边界

看到一个regex demo and a Python demo

例子

import re

pattern = r"-?\b\d+(?:[.,]\d+)*\s*m?g(?:\s*/\s*-?\d+(?:[.,]\d+)*\s*m?g)+\b"

strings = [
    "Dexamethasonacetat 5 mg/10 mg, Lidocain-HCl 1H2O 30 mg/60 mg",
    "Anakinra 120 mg /-20 g /-12mg gentechnologisch hergestellt aus E. coli. 10mg pack"
]

for s in strings:
    print([re.sub(r"[\s-]+", "", m) for m in re.findall(pattern, s)])

输出

['5mg/10mg', '30mg/60mg']
['120mg/20g/12mg']