我正在使用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'
但我对此非常不确定......特别是关于如何在正则表达式中引入交替变量。
答案 0 :(得分:4)
我认为你的amounts
是units
,所以我冒昧地解决这个用词不当。我建议使用命名分组来简化对输出的理解。
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
。
为了更好的正则表达式:
"^((?=.*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)