我正在尝试使用正则表达式处理自由格式文本文件以获取上下文信息,但是我正在使用的正则表达式没有按预期工作。
这些是我想要处理的一些示例(来自大量文本):
我试图用以下方法提取不同的部分:
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