2017-03-12 3 views
1

Wie werden [0-9]+ Gruppen erfasst, die durch (\], \[) abgegrenzt werden? Zum Beispiel im Fall vonRegulärer Ausdruck, um durch einen Ausdruck abgegrenzte Gruppen zu erfassen

[[[[u'1', u'2'], u'3'], u'4'], [[[u'1', u'2'], u'4'], [[u'1', u'5'], u'4']]] 

würde Ich mag drei Gruppen erfassen, 1 2 3 4, 1 2 4 und 1 5 4.

+1

Sie sollten dafür einen Parser verwenden, keine Regex. Regex verarbeitet die verschachtelte Struktur nicht gut. –

+0

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

Antwort

1

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.

Verwandte Themen