簡體   English   中英

python regex findall 返回兩組而不是一組

[英]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 演示

請參閱正則表達式演示 詳情

  • (?:Anakinra) - 一個關鍵字(我保留了這個組,以防有幾個關鍵字,如Anakinra|Anakirna
  • \s* - 零個或多個空格
  • (\d+(?:[.,]\d+)*) - 第 1 組:一位或多位數字,然后是. ,和一個或多個數字
  • \s* - 零個或多個空格
  • (g|mg|) - 第 2 組: gmg或無(您也可以使用(mg?|)

您可以嘗試使用以下正則表達式:

(?![^\d]+)[^,]+

解釋:

  • (?![^\d]+) :匹配除數字以外的任何字符的負前瞻
  • [^,]+ : 逗號以外的任何字符

在這里試試。


編輯:如果您需要更嚴格的版本。

(?!^'[^\d]+)\d+(\.\d)?( m?g)?

解釋:

  • (?!^'[^\d]+) :匹配的負前瞻...
    • ^' : 字符串開頭 + 引號
    • [^\d]+ : 數字以外的任意字符組合
  • \d+ : 數字組合
  • (\.\d+)? :點+數字的可選序列
  • ( m?g)? : 可選空間序列 + 可選m + g

在這里試試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM