Sono alle prese con le espressioni regolari. Ho problemi a girare la testa attorno a un testo simile annidato all'interno di un testo più grande. Forse puoi aiutarmi a sviare il mio pensiero.testo annidato nelle espressioni regolari
Ecco un esempio di stringa di prova:
message msgName { stuff { innerStuff } } \n message mn2 { junk }
voglio tirare fuori termine (ad esempio, msgName
, mn2
) e ciò che segue fino al prossimo messaggio, per ottenere una lista come questa:
Ho problemi con la corrispondenza troppo avidamente o non avidamente per mantenere le parentesi interne ma dividere i messaggi di livello superiore.
Ecco un programma:
import re
text = 'message msgName { stuff { innerStuff } more stuff } \n message mn2 { junk }'
messagePattern = re.compile('message (.*?) {(.*)}', re.DOTALL)
messageList = messagePattern.findall(text)
print "messages:\n"
count = 0
for message, msgDef in messageList:
count = count + 1
print str(count)
print message
print msgDef
Produce:
messages: 1 msgName stuff { innerStuff } more stuff } message mn2 { junk
Ecco il mio prossimo tentativo, il che rende la parte interna non avido:
import re
text = 'message msgName { stuff { innerStuff } more stuff } \n message mn2 { junk }'
messagePattern = re.compile('message (.*?) {(.*?)}', re.DOTALL)
messageList = messagePattern.findall(text)
print "messages:\n"
count = 0
for message, msgDef in messageList:
count = count + 1
print str(count)
print message
print msgDef
Produce :
messages: 1 msgName stuff { innerStuff 2 mn2 junk
Così, perdo } more stuff }
ho davvero incontrato un blocco mentale su questo. Potrebbe qualcuno indicarmi la giusta direzione? Non riesco a gestire il testo nelle parentesi annidate. Un suggerimento su un'espressione regolare di lavoro o un semplice esempio di gestione di testo simile annidato sarebbe utile.
Penso che questa questione merita un po 'di tempo trascorso sul MCVE: http://stackoverflow.com/help/mcve –
Così, il il punto è ottenere un pezzo di carattere parola seguito con un numero bilanciato di '{....}', giusto? Qualcosa come ['(\ w +) \ s * ({(?> [^ {}] ++ | (? 2)) *})'] (https://regex101.com/r/tN0nM8/1)? Per utilizzare questo approccio, è necessario un modulo regex PyPi. Altrimenti, scrivi un parser. Oppure, se sei sicuro che esiste un solo livello annidato, usa una soluzione alternativa: ['(\ w +) \ s * {[^ {}] * (?: {[^ {}] *} [^ {}] *) *} '] (https://regex101.com/r/tN0nM8/2) (può essere utilizzato con il modulo' re'). –
Would ['messaggio (. *?) {(. *?)} (?: \\ n | $)'] (https://regex101.com/r/mF6sC5/1) funziona? Se esiste un solo livello annidato di '{}', puoi anche usare ['message (. *?) {(. *? (?: {[^}] *}). *? |. *?)} '] (https://regex101.com/r/bB0yC5/1) – Druzion