簡體   English   中英

使用正則表達式Python進行復雜的文本提取

[英]Complex text extraction using regex Python

我有一個復雜字符串列表,它們基本上是不同產品的成分,如下所示:

ingredients = [['Sianliha, Vispautuva kasvirasvasekoite, sorsanrinta, broilerinmaksa, valkuainen, porkkana, palsternakka, purjo, juuripersilja, madeira, suola, E407, valkosipuli, mustapippuri, E300. Vehnäjauho, margariini, suola, kananmunan keltuainen ja liivate.']
['Tomaattimurska 91,5%, ekstra neitsytoliiviöljy 2%, sipuli 2%, riisitärkkelys,basilika 1,3%, suola, sokeri.']
['Eksta neitsyoliiviöljy 38,2%, basilika 34,3%, cashew pähkinäjauhe, Grana Padano juusto 7%(sis. kananmunanjäänteitä), suola, pinjansiemen, perunahiutale, sokeri, happamuudensäätelyaine: maitohappo, antioksidantti: askorbiinihappo.']
['Tomaattimurska 46%, naudan- ja sianliha 24%, tomaattipyree 10,2%, porkkana, sipuli, selleri, ekstra neitsyoliiviöljy 1,8%, suola, vehnäjauho, maitojauhe, sokeri.']
['Tomaattimurska 91,5%, ekstra neitsytoliiviöljy 2%, sipuli 2%, riisitärkkelys,basilika 1,3%, suola, sokeri.']
['viinietikka, rypälemehutiiviste, väriaine E150d']
['valkoviinietikka, rypälemehutiiviste']
['Sian- ja naudanliha, vesi, 1-luokan sulatejuusto (maito, hapate, suola, vesi, maitorasva, happamuudensäätöaine (E509), sulatesuolat (E452, E339, E 331), paakkuuntumisenestoaine (E460)), suola (1,7 %), mausteet (kumina), hydrolysoitu kasviproteiini, kasvirasva, stabilointiaine (E452), säilöntäaine (E250), hapettumisenestoaine (E315,E316), aromit (kumina), mausteuutteet']
['Sian- ja naudan liha, vesi, perunajauho, suola (1,8 %), mausteet (sinapinsiemen), sakkaroosi, hydrolysoitu kasviproteiini, kasvirasva, stabilointiaineet (E450, E452), hapettumisenestoaineet (E315, E316), säilöntäaine (E250), mausteuutteet (mm. selleri, korianteri), aromit (mm.kumina)']
['Sian- ja naudanliha, vesi, suola (1,7 %), mausteet (kumina, mustapippuri, naga morich -chili, valkosipuli), hydrolysoitu kasviproteiini, kasvirasva, glukoosi, stabilointiaine (E450, E452), hapettumisenestoaine (E315,E316), säilöntäaine (E250), mausteuutteet, aromit']
['Sian- ja naudanliha, vesi, suola (1,7 %), mausteet (valkopippuri, muskottipähkinä, korianteri, kardemumma), stabilointiaine (E450), glukoosi, hapettumisenestoaine (E316), säilöntäaine (E250),  aromit']
['Naudanliha, vesi, suola, (1,9 %), glukoosi, stabilointiaineet (E450, E451), hapettumisenestoaine (E316), säilöntäaine (E250), aromit']
['Sianliha, vesi, suola (1,7 %), mausteet (valkopippuri, muskottipähkinä, korianteri, kardemumma, valkosipuli), glukoosi, stabilointiaineet (E450, E451), hapettumisenestoaine (E316), säilöntäaine (E250), aromit']
['Sianliha, vesi, suola (1,7 %), hydrolysoitu kasviproteiini, kasvirasva, mausteet (mm.viherpippuri), glukoosi, stabilointiaine (E450, E451), hapettumisenestoaine (E300, E316), säilöntäaine (E250), mausteuutteet, aromit']
['Sian- ja naudanliha, vesi, suola (1,7 %), mausteet (valkopippuri, muskottipähkinä, korianteri, kardemumma), stabilointiaine (E450), glukoosi, hapettumisenestoaine (E316), säilöntäaine (E250),  aromit']]

我只需要取出原始單詞(成分)而不是百分比,而東西包含E。 現在我正在使用以下正則表達式:

for i in range (len(ingredients)):
     regex = re.findall(r'\(E\d+\)|\(E \d+\)|([^\W\d]+(?:\s+[^\W\d]+)*)', ingredients[i])

它適用於幾乎90%的情況,但如果你將這個代碼粘貼在regex網站上,那么你會發現仍然有很少的帶有E的令牌進入字符串,我無法弄清楚如何刪除。 例如,(E450,E451)和E150d(沒有括號的Es),這種文本仍然無法訪問正則表達式我該怎么做? 謝謝。

我只需要取出原始單詞(成分)而不是百分比,而東西包含E。

似乎做得很好的表達方式是這樣的:

\s*\(?(?:\d+(?:[.,]\d+)?\s*%|E\s*\d+[a-z]?(?:\s*,\s*E\s*?\d+[a-z]?)*)\)?

分解:

\s*                 # leading whitespace
\(?                 # an opening "(", optional
(?:                 # start non-capturing group
  \d+               #   digits
  (?:[.,]\d+)?      #   decimal part, comma or dot separator, optional
  \s*%              #   a percent sign, optionally preceded by space
  |                 #   or...
  E\s*              #   "E" followed by optional whitespace
  \d+[a-z]?         #   multiple digits and an optional character
  (?:               #   start non-capturing group
    \s*,\s*         #     a comma, space optional
    E\s*            #     "E" followed by optional whitespace
    \d+[a-z]?       #     multiple digits and an optional character
  )*                #   end group, repeat if possible
)                   # end group
\)?                 # a closing ")", optional

使用它來匹配相關部分並從匹配中創建新列表。

如果您不需要,可以通過小修改從匹配中刪除逗號和括號。

暫無
暫無

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

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