Domanda

Ho il seguente modello di regex:

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

I recuperali usando:

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

tuttavia usare re.findall produce lo stesso risultato.

Dovrebbe corrispondere ai testi come questo:

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

La prima cosa che sta accadendo è che usando re.M e re.X non funziona, ma se metto tutto in una linea lo fa.L'altra cosa è che quando funziona solo il primo gruppo è catturato e il resto ignorato.Qualche idea?

Informazioni aggiuntive:

Se cambio il mio modello per essere solo:

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

La mia output esce come questo: [u'Red Retro Citrus Juicer'] Corrisponde a tutta esso che lo SKU non appare.Se metto tutto sulla stessa linea, come così:

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

Abbina e prendi tutto.

È stato utile?

Soluzione

Quando si utilizza il flag X, è necessario sfuggire al #, che avvia i commenti.

In questo momento il tuo regex a due linee è equivalente a

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

Cosa vuoi è

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

Nota il \# ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top