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

2024-10-01 19:33:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我在用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''banana'

我编写了这个regexp来匹配上面字符串的数量部分:

\d{1,3}\s<altern>?\s?(\bof\b)?

但我对此非常不确定…特别是如何在正则表达式中引入altern变量。你知道吗


Tags: of类型数量数组sugar区分cup食物
3条回答

您可以尝试以下代码:

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')]

我认为你的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']

我想你可以用这个:

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

第一部分得到\1,第二部分得到\2。你知道吗

[Regex Demo]

为了更好的正则表达式:

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

第一部分得到\3\6,第二部分得到\4\7。你知道吗

相关问题 更多 >

    热门问题