使用Python正则表达式组从自由形式的笔记中提取文本

时间:2017-08-15 15:58:52

标签: python regex

我正在尝试使用正则表达式处理自由格式文本文件以获取上下文信息,但是我正在使用的正则表达式没有按预期工作。

这些是我想要处理的一些示例(来自大量文本):

  • 每周2罐啤酒
  • 8-10啤酒1x /周
  • 报道他每周饮用1-2次,并在此期间饮用12包啤酒
  • 每周6包啤酒,一次喝1-3啤酒
  • 2-4盎司的葡萄酒4 x周
  • 每日饮酒者(每天1包)

我试图用以下方法提取不同的部分:

sizes = {  # drink volume in oz
            'oz': 1,
            '[^a-z]cans?[^a-z]': 12,
            '[^a-z]glass': 5,
            'bottle': 25,
            'shot': 1.5,
            'pint': 16,
            'fifth': 25,
            'large can': 22,
            '6.{,3}pack': 72,
            '12.{,3}pack': 144,
}
szre = r'|'.join('(%s)' % sz for sz in sizes)
''.join(re.findall('\d+((\-|/|\.)\d+)?.{,3}((%s)|(%s))' % (szre, sbre), line)[0])

和sbre是一个类似的群体表达。 到目前为止,运行代码给了我

(Pdb++) line1 = '2 cans of beer per week'
(Pdb++) ''.join(re.findall('\d+((\-|/|\.)\d+)?.{,3}((%s)|(%s))' % (szre, sbre), line1)[0])
' cans  cans  cans '

而不是预期的

  

'2罐'

我怎样才能让它更好地运作?顺便说一句,我已经注意到re.findall()对组做了奇怪的事情,因此使用'.join()进行解决。

感谢。

编辑:链接到来源:https://github.com/skeledrew/medical-nlp-research/blob/master/add_feats.py 由于PHI敏感性,当然无法提供实际数据。

编辑:MCVE按要求

>>> szre = '([^a-z]glass)|(pint)|([^a-z]cans?[^a-z])|(fifth)|(bottle)|(6.{,3}pack)|(12.{,3}pack)|(large can)|(shot)'
>>> sbre = '(wine)|(drink)|(liquor)|(milwaukee best ice)'
line1 = '2 cans of beer per week'
>>> ''.join(re.findall(r'\d+(?:[-/.]\d+)? {0,3}%s%s' % (szre, sbre), line1)[0])
' cans '  # still wrong
>>> re.search('\d+((\-|/|\.)\d+)?.{,3}((%s)|(%s))' % (szre, sbre), line1)
<_sre.SRE_Match object; span=(0, 7), match='2 cans '>  # correct span/match

0 个答案:

没有答案