Hier ist, wie dies mit gregexpr()
+ regmatches()
erfolgen:
ipartRE <- '\\d+';
fpartRE <- '\\.\\d+';
numRE <- paste0(ipartRE,'(?:',fpartRE,')?');
rangeRE <- paste0(numRE,'(?:\\s*-\\s*',numRE,')?');
pat <- paste0(rangeRE,'\\s*[a-zA-Z]{1,3}\\b');
regmatches(t1,gregexpr(perl=T,pat,t1))[[1L]];
## [1] "3-4 cm" "5.6 m" "10 m"
I aufgebaut die Regex inkrementell aus Komponenten für die menschliche Lesbarkeit, aber offensichtlich müssen Sie das nicht tun.
Um dem neuen Muster zu entsprechen, müssen wir eine Alternierung für die zweite Zahl akzeptieren, die passende Klammern um die Zahl enthält. Ich fand auch, dass der Strich in 120(–150) cm
in nicht einem normalen ASCII hyphen, sondern ist ein en dash, und so habe ich einen weiteren vorberechneten regulären Ausdruck Stück dashRE
genannt, die alle drei gemeinsamen Strich Typen entspricht (ASCII, en Bindestrich und em dash):
ipartRE <- '\\d+';
fpartRE <- '\\.\\d+';
numRE <- paste0(ipartRE,'(?:',fpartRE,')?');
dashRE <- '[—–-]';
rangeOptParenRE <- paste0(numRE,'(?:\\s*(?:',dashRE,'\\s*',numRE,'|\\(\\s*',dashRE,'\\s*',numRE,'\\s*\\)\\s*))?');
pat <- paste0(rangeOptParenRE,'\\s*[a-zA-Z]{1,3}\\b');
regmatches(t1,gregexpr(perl=T,pat,t1))[[1L]];
## [1] "3-4 cm" "120(–150) cm" "5.6 m" "10 m"
Es wäre hilfreich, wenn Sie einige Daten bereitstellen könnten, mit denen die Leute spielen können (ein Spielzeugbeispiel). – milan
Vorschläge: 'gregexpr' und' regmatches' oder da ist das 'stringi' Paket und seine 'stri_extract_all' Funktionen. 'gsub' könnte auch funktionieren. – Jota