使用单词列表的正则表达式

时间:2015-08-03 13:25:40

标签: python regex

我正在使用Python。

我有一些字符串:

'1 banana', '100 g of sugar', '1 cup of flour'

我需要区分食物和数量。 我有一个数量类型

的数组

quantities = ['g', 'cup', 'kg', 'L'] altern = '|'.join(quantities)

所以使用正则表达式我希望得到例如'1 cup of flour''flour''1 cup of''1 banana''1'和{ {1}}

我写了这个正则表达式以匹配上面字符串的数量部分:

'banana'

但我对此非常不确定......特别是关于如何在正则表达式中引入交替变量。

4 个答案:

答案 0 :(得分:4)

我认为你的amountsunits,所以我冒昧地解决这个用词不当。我建议使用命名分组来简化对输出的理解。

import re

units = [ 'g', 'cup', 'kg', 'L' ]
anyUnitRE = '|'.join(units)

inputs = [ '1 banana', '100 g of sugar', '1 cup of flour' ]

for input in inputs:
  m = re.match(
    r'(?P<amount>\d{1,3})\s*'
    r'(?P<unit>(' + anyUnitRE + r')?)\s*'
    r'(?P<preposition>(of)?)\s*'
    r'(?P<name>.*)', input)
  print m and m.groupdict()

输出将是这样的:

{'preposition': '', 'amount': '1', 'name': 'banana', 'unit': ''}
{'preposition': 'of', 'amount': '100', 'name': 'sugar', 'unit': 'g'}
{'preposition': 'of', 'amount': '1', 'name': 'flour', 'unit': 'cup'}

所以你可以这样做:

if m.groupdict()['name'] == 'sugar':
  …
amount = int(m.groupdict()['amount'])
unit = m.groupdict()['unit']

答案 1 :(得分:2)

我认为你可以使用它:

"(.*?) (\w*)$"

第一部分获得\1,第二部分获得\2

[Regex Demo]

为了更好的正则表达式:

"^((?=.*of)((.*of)(.*)))|((?!.*of)(\d+)(.*))$"

第一部分获得\3\6,第二部分获得\4\7

答案 2 :(得分:0)

您可以尝试以下代码:

import re
lst = ['1 banana', '100 g of sugar', '1 cup of flour']
quantities = ['g', 'cup', 'kg', 'L']
altern = '|'.join(quantities)
r = r'(\d{1,3})\s*((?:%s)?s?(?:\s*\bof\b)?\s*\S+)'%(altern)
for x in lst:
    print re.findall(r, x)

请参阅demo

输出:

[('1', 'banana')]
[('100', 'g of sugar')]
[('1', 'cup of flour')]

答案 3 :(得分:0)

为什么要用正则表达式执行此操作?您可以使用Python的字符串拆分函数:

def qsplit(a):
    """Return a tuple of quantity and ingredient"""

    if not a:
        return None

    if not a[0] in "0123456789":
        return ["0", a]

    if " of " in a:
        return a.split(" of ", 1)

    return a.split(None, 1)