【发布时间】:2014-12-04 17:32:38
【问题描述】:
我有这个字符串:
s = u'vitamin a min. 14,053 iu/kg vitamin c 13,000iu/kg vitamin d max. 10,000\u03bc/kg copper 1mg/kg vitamin e mon 10.00iu/kg'
我想把它拆开,所以我得到[label, label2, amount, units]。
-
label是名称,即vitamin c,可以包含 unicode 字符 -
label2是min|max,具体取决于特定的字符串。 -
amount是列出的数字量(可以包括逗号或小数) -
units可以包含 unicode 字符
您可以看到已经出现了一些边缘情况:
- 某些成分不包含
label2=min或max(请参阅copper和vitamin c)。在这种情况下,正则表达式分组可以是None。 - 某些成分的
label2拼写错误(请参阅vitamin e使用mon) - 单位中可能有 unicode
理想情况下,我想要一个可以匹配单个成分的正则表达式以及一个杂乱的列表(就像我提供的那样)。
我想出了:
import re
regex = re.compile(ur'([a-z 0-9]+)(min|max|mon)?[. ]+([0-9., ]+)((?=[%])|[a-z/]+|[^\W\d_]+/[^\W\d_]+)', re.UNICODE)
re.findall(regex, s)
# [(u'vitamin a min', u'', u'14,053 ', u'iu/kg'), (u' vitamin c', u'', u'13,000', u'iu/kg'), (u' vitamin d max', u'', u'10,000', u'\u03bc/kg'), (u' copper', u'', u'1', u'mg/kg'), (u' vitamin e mon 10', u'', u'00', u'iu/kg')]
re.findall(regex, u'vitamin a min. 14,053 iu/kg')
# [(u'vitamin a min', u'', u'14,053 ', u'iu/kg')]
这几乎匹配所有内容,但您会发现一些问题。
label匹配min,max和label2不匹配。我不喜欢硬编码
(min|max|mon),因为在某些情况下,单词被拼错成其他东西,而硬编码无法捕捉到它。
【问题讨论】: