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
匹配可选的空白字符,可选的 m
和 g
(?:
非捕获组整体重复
\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']
我正在使用一些药物的数据框,我想从产品描述中的完整句子中提取剂量。
我想要的示例:
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
匹配可选的空白字符,可选的m
和g
(?:
非捕获组整体重复\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']