Angenommen, Sie haben keine Untermuster wie [[u'1', u'2'], [u'3',u'5']]
(mehrere verschachtelte Untergruppen auf der gleichen Ebene, in diesem Fall müssen Sie einen Stapel verwenden und parsen wie Pushdown-Automaten) können Sie dies mit regulären Ausdrücken tun zwei Schritte:
(1) splitten Sie den Ausdruck mit Regex \]\s*,\s*\[
, um die Gruppen zuerst zu erhalten, Sie erhalten 3 Gruppen für das Beispiel zur Verfügung gestellt.
(2) Verwenden Sie in jeder Gruppe die Regex [^0-9u]*u'([0-9]+)'[^0-9u]*
, um die Ziffern zu extrahieren.
Zum Beispiel in R
, wird der Code sein:
str <- "[[[[u'1', u'2'], u'3'], u'4'], [[[u'1', u'2'], u'4'], [[u'1', u'5'], u'4']]]"
groups <- unlist(strsplit(str, split='\\]\\s*,\\s*\\['))
pattern <- "[^0-9u]*u'([0-9]+)'[^0-9u]*"
lapply(groups, function(str) gsub(pattern, "\\1", regmatches(str,gregexpr(pattern,str))[[1]]))
#[[1]]
#[1] "1" "2" "3" "4"
#[[2]]
#[1] "1" "2" "4"
#[[3]]
#[1] "1" "5" "4"
In python
:
import re
str = "[[[[u'1', u'2'], u'3'], u'4'], [[[u'1', u'2'], u'4'], [[u'1', u'5'], u'4']]]"
groups = re.split('\]\s*,\s*\[', str)
pattern = "[^0-9u]*u'([0-9]+)'[^0-9u]*"
print map(lambda x: re.findall(pattern, x), groups)
# [['1', '2', '3', '4'], ['1', '2', '4'], ['1', '5', '4']]
Sie die Ziffern auf ganze Zahlen abbilden könnten, falls erforderlich.
Sie sollten dafür einen Parser verwenden, keine Regex. Regex verarbeitet die verschachtelte Struktur nicht gut. –
Danke, @TimBiegeleisen! Ich verbrachte zu lange Zeit damit, die Liste zu glätten und hoffte dann eine magische Regex zu finden, die alles löste, aber dein Kommentar öffnete meine Augen und löste es mit einer Kombination aus re.split und re.findall in Python – Adam