Regex non afferrando tutti i gruppi, non lavorando in multilinea
-
23-12-2019 - |
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.
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 \#
...