繁体   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