正则表达式没有抓住所有组,不在多线工作

时间:2014-02-27 14:31:21

标签: python regex regex-group

我有以下正则表达式模式:

pattern = r'''
        (?P<name>.+?)\n
        SKU\s#\s+(?P<sku_hidden>\d+)\n
        Quantity:\s+(?P<quantity>\d+)\n
        Gift\sWrap:\s+(?P<gift_wrap>.+?)\n
        Shipping\sMethod:.+?\n
        Price:.+?\n
        Total:\s+(?P<total_price>\$[\d.]+)
        '''  

我使用以下方法检索它们:

re.finditer(pattern, plain, re.M | re.X)

然而,使用re.findall会产生相同的结果。

它应该匹配这样的文字:

Red Retro Citrus Juicer
SKU # 403109
Quantity: 1
Gift Wrap: No
Shipping Method:Standard
Price: $24.99
Total: $24.99

正在发生的第一件事是使用re.Mre.X它不起作用,但如果我把它全部放在一行中就行了。另一件事是,当它确实有效时,只有第一组被捕获而其余组被忽略。有什么想法吗?

其他信息:

如果我将我的模式改为:

pattern = r'''
        (?P<name>.+?)\n
        SKU\s#\s+(?P<sku_hidden>\d+)\n
        '''

我的输出结果如下:[u'Red Retro Citrus Juicer']它匹配但SKU没有出现。如果我把所有东西都放在同一条线上,就像这样:

pattern = r'(?P<name>.+?)\nSKU\s#\s+(?P<sku_hidden>\d+)\n' 

它匹配并抓住一切。

1 个答案:

答案 0 :(得分:1)

使用X标志时,您需要转义启动评论的#

现在你的两行正则表达式相当于

(?P<name>.+?)\n
SKU\s

你想要的是

pattern = r'''
    (?P<name>.+?)\n
    SKU\s\#\s+(?P<sku_hidden>\d+)\n
    Quantity:\s+(?P<quantity>\d+)\n
    Gift\sWrap:\s+(?P<gift_wrap>.+?)\n
    Shipping\sMethod:.+?\n
    Price:.+?\n
    Total:\s+(?P<total_price>\$[\d.]+)
    '''  

请注意\# ...