python regex findall returns 两组而不是一组
python regex findall returns two groups instead of just one
我正在使用包含一些药物的数据框,我想从产品描述的完整句子中提取剂量。
一些例子:
'Anakinra 100 g, gentechnologisch hergestellt aus E. coli.'
'Anakinra 100 mg, gentechnologisch hergestellt aus E. coli.'
'Anakinra 10.5 g, gentechnologisch hergestellt aus E. coli.'
'Anakinra 10, gentechnologisch hergestellt aus E. coli.'
我想要:
'100g'
'100mg'
'10.5g'
'10'
因为我想对每个产品都这样做,所以我决定使用一个以产品名称作为变量的正则表达式,这样我以后可以 运行 一个完整产品列表的循环。
我试过了:
a_string = "Anakinra 100 mg, gentechnologisch hergestellt aus E. coli."
pattern = 'Anakinra'
re.findall(f"({pattern}\s*\d+(?:[.,]\d+)*\s*\b(g|mg|)", a_string)
#[('Anakinra 100 mg', 'mg')]
如您所见,它返回了两组而不是一组。这也可能不是正确的程序,因为最后我只想要字符串的剂量部分。您的解决方案是什么?
您可以捕获必要的详细信息,然后加入两个群组:
import re
a_string = "Anakinra 100 mg, gentechnologisch hergestellt aus E. coli."
pattern = 'Anakinra'
print ( [f"{x}{y}" for x,y in re.findall(rf"(?:{pattern})\s*(\d+(?:[.,]\d+)*)\s*(g|mg|)", a_string)] )
# => ['100mg']
参见Python demo。
见regex demo。 详情:
(?:Anakinra)
- 一个关键字(我保留了该组以防有多个关键字,如 Anakinra|Anakirna
)
\s*
- 零个或多个空格
(\d+(?:[.,]\d+)*)
- 第 1 组:一位或多位数字,然后零次或多次重复 .
或 ,
和一位或多位数字
\s*
- 零个或多个空格
(g|mg|)
- 第 2 组:g
、mg
或无(您也可以使用 (mg?|)
)
您可以尝试使用以下正则表达式:
(?![^\d]+)[^,]+
解释:
(?![^\d]+)
: 匹配除了数字 以外的任何字符的否定先行
[^,]+
:逗号以外的任意字符
试试看 here.
编辑:如果您需要更严格的版本。
(?!^'[^\d]+)\d+(\.\d)?( m?g)?
解释:
(?!^'[^\d]+)
: 负前瞻匹配...
^'
:字符串开头 + 引号
[^\d]+
:除数字 以外的任意字符组合
\d+
: 数字组合
(\.\d+)?
:点+数字的可选序列
( m?g)?
:可选序列space+可选m
+g
试试看 here.
我正在使用包含一些药物的数据框,我想从产品描述的完整句子中提取剂量。
一些例子:
'Anakinra 100 g, gentechnologisch hergestellt aus E. coli.'
'Anakinra 100 mg, gentechnologisch hergestellt aus E. coli.'
'Anakinra 10.5 g, gentechnologisch hergestellt aus E. coli.'
'Anakinra 10, gentechnologisch hergestellt aus E. coli.'
我想要:
'100g'
'100mg'
'10.5g'
'10'
因为我想对每个产品都这样做,所以我决定使用一个以产品名称作为变量的正则表达式,这样我以后可以 运行 一个完整产品列表的循环。
我试过了:
a_string = "Anakinra 100 mg, gentechnologisch hergestellt aus E. coli."
pattern = 'Anakinra'
re.findall(f"({pattern}\s*\d+(?:[.,]\d+)*\s*\b(g|mg|)", a_string)
#[('Anakinra 100 mg', 'mg')]
如您所见,它返回了两组而不是一组。这也可能不是正确的程序,因为最后我只想要字符串的剂量部分。您的解决方案是什么?
您可以捕获必要的详细信息,然后加入两个群组:
import re
a_string = "Anakinra 100 mg, gentechnologisch hergestellt aus E. coli."
pattern = 'Anakinra'
print ( [f"{x}{y}" for x,y in re.findall(rf"(?:{pattern})\s*(\d+(?:[.,]\d+)*)\s*(g|mg|)", a_string)] )
# => ['100mg']
参见Python demo。
见regex demo。 详情:
(?:Anakinra)
- 一个关键字(我保留了该组以防有多个关键字,如Anakinra|Anakirna
)\s*
- 零个或多个空格(\d+(?:[.,]\d+)*)
- 第 1 组:一位或多位数字,然后零次或多次重复.
或,
和一位或多位数字\s*
- 零个或多个空格(g|mg|)
- 第 2 组:g
、mg
或无(您也可以使用(mg?|)
)
您可以尝试使用以下正则表达式:
(?![^\d]+)[^,]+
解释:
(?![^\d]+)
: 匹配除了数字 以外的任何字符的否定先行
[^,]+
:逗号以外的任意字符
试试看 here.
编辑:如果您需要更严格的版本。
(?!^'[^\d]+)\d+(\.\d)?( m?g)?
解释:
(?!^'[^\d]+)
: 负前瞻匹配...^'
:字符串开头 + 引号[^\d]+
:除数字 以外的任意字符组合
\d+
: 数字组合(\.\d+)?
:点+数字的可选序列( m?g)?
:可选序列space+可选m
+g
试试看 here.