Ich kämpfe mit regulären Ausdrücken. Ich habe Probleme, meinen Kopf um einen ähnlichen Text zu legen, der in größeren Text eingebettet ist. Vielleicht kannst du mir helfen, meine Gedanken zu klären.verschachtelter Text in regulären Ausdrücken
Hier ist ein Beispiel Test-String:
message msgName { stuff { innerStuff } } \n message mn2 { junk }
Ich möchte Begriff ziehen (zB msgName
, mn2
) und was bis zur nächsten Nachricht folgt eine Liste wie folgt zu erhalten:
msgName { stuff { innerStuff } more stuff } mn2 { junk }'
Ich habe Probleme mit zu gierig oder nicht gierig passend, um die inneren Klammern zu behalten, aber die höheren Nachrichten getrennt. Hier
ist ein Programm:
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
Es produziert:
messages: 1 msgName stuff { innerStuff } more stuff } message mn2 { junk
Hier ist mein nächster Versuch, die den inneren Teil nicht gierig macht:
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
Es produziert :
messages: 1 msgName stuff { innerStuff 2 mn2 junk
Also, ich verliere } more stuff }
Ich habe wirklich in eine mentale Blockade auf diese laufen. Könnte mir jemand in die richtige Richtung zeigen? Ich bin nicht in der Lage, Text in verschachtelten Klammern zu behandeln. Ein Vorschlag für einen funktionierenden regulären Ausdruck oder ein einfacheres Beispiel für den Umgang mit verschachteltem, ähnlichem Text wäre hilfreich.
ich glaube, diese Frage ein wenig Zeit auf dem MCVE verbrachte verdient: http://stackoverflow.com/help/mcve –
Also, die Punkt ist ein Wort Zeichen Chunk gefolgt mit einer ausgewogenen Anzahl von '{}}, oder? Etwas wie ['(\ w +) \ s * ({(?> [^ {}] ++ | (? 2)) *})'] (https://regex101.com/r/tN0nM8/1)? Um diesen Ansatz zu verwenden, benötigen Sie ein PyPi-Regex-Modul. Andernfalls schreibe einen Parser. Oder - wenn Sie sicher sind, dass es nur eine verschachtelte Ebene gibt, verwenden Sie eine Umgehungslösung: ['(\ w +) \ s * {[^ {}] * (?: {[^ {}] *} [^ {}] *) *} '] (https://regex101.com/r/tN0nM8/2) (es kann mit' re' Modul verwendet werden). –
Würde [message (. *?) {(. *?)} (?: \\ n | $) '] (https://regex101.com/r/mF6sC5/1) funktionieren? Wenn es nur eine verschachtelte Ebene von '{}' gibt, können Sie auch ['message (. *?) {(. *? (?: {[^}] *}). *? |. *?)} Verwenden. '] (https://regex101.com/r/bB0yC5/1) – Druzion