正则表达式解析我想要的某些价值

时间:2016-09-28 08:00:12

标签: python regex

使用https://regex101.com/

  • 我目前的正则表达式:^.*'(\d\s*.*)'*$

似乎不起作用。我应该使用哪种合适的组合公式?

我希望能够解析 4 变量 项目,数量,费用和总计

我的代码:

import re

str = "xxxxxxxxxxxxxxxxxx" 
match = re.match(r"^.*'(\d\s*.*)'*$",str) 
print match.group(1)

1 个答案:

答案 0 :(得分:1)

以下正则表达式匹配每个成分字符串并将想要的信息存储到组中:r'^(\d+)\s+([A-Za-z ]+)\s+(\d+(?:\.\d*))$'

它定义了3个组,每个组用空格隔开:

  • ^标记字符串开始
  • (\d+)是第一个群组,至少会找到一位数字
  • \s+是群组之间的第一个分隔,并且会查找至少一个白色字符
  • ([A-Za-z ]+)是第二组,并且会查找至少一个按字母顺序排列的字符或空格
  • \s+是群组之间的第二个分隔,并且会查找至少一个白色字符
  • (\d+(?:\.\d*)是第三组,查找至少一位数字,最后是小数点和其他一些数字
  • $标记字符串结束

我认为不需要解释获得总数的正则表达式。

这是使用您的测试数据的测试代码。应该是一个很好的起点:

import re

TEST_DATA = ['Table: Waiter: kenny',
             '======================================',
             '1 SAUSAGE WRAPPED WITH B 10.00',
             '1 ESCARGOT WITH GARLIC H 12.00',
             '1 PAN SEARED FOIE GRAS 15.00',
             '1 SAUTE FIELD MUSHROOM W 9.00',
             '1 CRISPY CHICKEN WINGS 7.00',
             '1 ONION RINGS 6.00',
             '----------------------------------',
             'TOTAL 59.00',
             'CASH 59.00',
             'CHANGE 0.00',
             'Signature:__________________________',
             'Thank you & see you again soon!']

INGREDIENT_RE = re.compile(r'^(\d+)\s+([A-Za-z ]+)\s+(\d+(?:\.\d*))$')
TOTAL_RE = re.compile(r'^TOTAL (.+)$')

ingredients = []
total = None
for string in TEST_DATA:
    match = INGREDIENT_RE.match(string)
    if match:
        ingredients.append(match.groups())
        continue
    match = TOTAL_RE.match(string)
    if match:
        total = match.groups()[0]
        break

print(ingredients)
print(total)

打印:

[('1', 'SAUSAGE WRAPPED WITH B', '10.00'), ('1', 'ESCARGOT WITH GARLIC H', '12.00'), ('1', 'PAN SEARED FOIE GRAS', '15.00'), ('1', 'SAUTE FIELD MUSHROOM W', '9.00'), ('1', 'CRISPY CHICKEN WINGS', '7.00'), ('1', 'ONION RINGS', '6.00')]
59.00

编辑Python原始字符串:

Python字符串前面的r字符表示它是一个原始字符串,这意味着不解释spécial字符(如\t\n等...)。

要清楚,例如,在标准字符串\t中是一个制表字符。它是一个原始字符串,它有两个字符:\t

r'\t'相当于'\\t'

more details in the doc