Supponiamo che io sono le seguenti stringhe:Regex: come posso catturare un gruppo dopo un gruppo di acquisizione opzionale utilizzando le espressioni regolari?
s1=u'--FE(-)---'
s2=u'--FEM(-)---'
s3=u'--FEE(--)-'
e voglio abbinare F, E, E, M e il contenuto delle parentesi in gruppi diversi.
Ho provato la seguente espressione regolare:
u'^.-([F])([EF]*)([E]+)[^FEM]?(M*)?(\\(.*\\))?.*$'
Questo espressioni danno i seguenti gruppi e si estende per le diverse stringhe:
s1 -> 'F',(2,3) , '',(3,3) , 'E',(3,4) , '',(5,5) , None,(-1,-1)
s2 -> 'F',(2,3) , '',(3,3) , 'E',(3,4) , 'M',(4,5) , (-),(5,8)
s3 -> 'F',(2,3) , 'E',(3,4) , 'E',(4,5) , '',(6,6) , None,(-1,-1)
per S2, ottengo il comportamento desiderato, un abbinamento dei contenuti delle parentesi, ma per s1 e s3 non lo faccio.
Come si crea un'espressione regolare che corrisponda al contenuto delle parentesi anche se non ho una corrispondenza corretta per il gruppo che contiene "M"?
EDIT:
La risposta dal DWilches risolto il problema iniziale utilizzando l'espressione regolare
'^.-(F)([EF]*)(E+)[^FEM]??(M*)(\(.*\)).*?$'
Tuttavia, il gruppo parentesi è opzionale. Il seguente script python breve chiarisce il problema:
s1=u'--FE(-)---'
s2=u'--FEM(-)--'
s3=u'--FEE(--)-'
s4=u'--FEE-M(---)--'
s5=u'--FE-M-(-)-'
s6=u'--FEM--'
s7=u'--FE-M--'
ll=[s1,s2,s3,s4,s5,s6,s7]
import re
rr1=re.compile(u'^.-(F)([EF]*)(E+)[^FEM]??(M*)[^FEM]??(\(.*\)).*?$')
rr2=re.compile(u'^.-(F)([EF]*)(E+)[^FEM]??(M*)[^FEM]??(\(.*\))?.*?$')
for s in ll:
b=rr1.search(s)
print s
if b:
print " '%s' '%s' '%s' '%s' '%s' " % (b.group(1), b.group(2), b.group(3), b.group(4), b.group(5))
else:
print 'No match'
print '######'
Per rr1
, l'output è:
--FE(-)---
'F' '' 'E' '' '(-)'
######
--FEM(-)--
'F' '' 'E' 'M' '(-)'
######
--FEE(--)-
'F' 'E' 'E' '' '(--)'
######
--FEE-M(---)--
'F' 'E' 'E' 'M' '(---)'
######
--FE-M-(-)-
'F' '' 'E' 'M' '(-)'
######
--FEM--
No match
######
--FE-M--
No match
######
E 'OK per i primi 5 corde, ma non per le ultime due, in quanto richiede la parentesi.
Il rr2
, tuttavia, l'aggiunta ?
a (\(.*\))
, produce l'uscita seguente:
--FE(-)---
'F' '' 'E' '' '(-)'
######
--FEM(-)--
'F' '' 'E' 'M' '(-)'
######
--FEE(--)-
'F' 'E' 'E' '' '(--)'
######
--FEE-M(---)--
'F' 'E' 'E' '' 'None'
######
--FE-M-(-)-
'F' '' 'E' '' 'None'
######
--FEM--
'F' '' 'E' 'M' 'None'
######
--FE-M--
'F' '' 'E' '' 'None'
######
Questo è ok per s1,s2,s3
e s6
.
Alcune modifiche sono necessarie per ottenere l'output desiderato: ottenere il M
se esiste e il contenuto delle parentesi se esistono le parentesi.
Questa è la domanda. La parentesi aperta viene utilizzata da '[^ FEM]?' E la stringa rimanente dalla fine '. *' – sharcashmo
Ciò aiuta parzialmente. Tuttavia, l'espressione non risolve cose come --FEE-M (-) - o --FEM - (-) - –
Nel mio test usando il modello con '--FEE-M (-) - -' produce: ''F' 'E' 'E' 'M' '(-)''. Qual è l'output previsto allora? – MondKin