2016-09-19 19 views
3

Ich verwende R, Version 3.3.1. Ich habe folgende Spalte:Wort beginnt nicht mit Zahl oder Stern und Zahl (Regex)

my_column <- 
c("1. SuvlasniÄŤki dio: 1/21. SuvlasniÄŤki dio: 1/2 ", "CRKVENAC ANDRIJA, GAREĹ NICA KBR. 42CRKVENAC ANDRIJA, GAREĹ NICA KBR. 42 ", 
"2. SuvlasniÄŤki dio: 1/22. SuvlasniÄŤki dio: 1/2 ", "CRKVENAC LJUBICA ROÄ. VERTUĹ , GAREĹ NICA KBR. 42CRKVENAC LJUBICA ROÄ. VERTUĹ , GAREĹ NICA KBR. 42 ", 
"*1. Vlasnički dio: 1/1*1. Vlasnički dio: 1/1 ", "*MUHVIĆ IVAN, ANTUNOV, GAREŠNICA, MATIJE GUPCA 3*MUHVIĆ IVAN, ANTUNOV, GAREŠNICA, MATIJE GUPCA 3 ", 
"2. SuvlasniÄŤki dio: 1/22. SuvlasniÄŤki dio: 1/2 ", "ANÄAL-MLINARIĆ BRIGITA, BJELOVAR, V. LISINSKOG KBR. 4ANÄAL-MLINARIĆ BRIGITA, BJELOVAR, V. LISINSKOG KBR. 4 ", 
"3. SuvlasniÄŤki dio: 1/23. SuvlasniÄŤki dio: 1/2 ", "ANÄAL LIDIJA, GAREĹ NICA, MATIJE GUPCA KBR. 156ANÄAL LIDIJA, GAREĹ NICA, MATIJE GUPCA KBR. 156 " 
) 

Strings in Spalte beginnt mit Buchstaben, Zahl, * Nummer oder * Brief. Ich möchte alle Zeichenfolgen löschen, die mit Nummer und * Nummer beginnen. Ich habe folgenden Code versucht:

my_column[grepl(pattern = "(?=^[^\\*]\\D{2})(?=^\\D)", x = my_column, perl = TRUE)] 
# [1] "CRKVENAC ANDRIJA, GAREĹ NICA KBR. 42CRKVENAC ANDRIJA, GAREĹ NICA KBR. 42 "          
# [2] "CRKVENAC LJUBICA ROÄ. VERTUĹ , GAREĹ NICA KBR. 42CRKVENAC LJUBICA ROÄ. VERTUĹ , GAREĹ NICA KBR. 42 "   
# [3] "ANÄAL-MLINARIĆ BRIGITA, BJELOVAR, V. LISINSKOG KBR. 4ANÄAL-MLINARIĆ BRIGITA, BJELOVAR, V. LISINSKOG KBR. 4 " 
# [4] "ANÄAL LIDIJA, GAREĹ NICA, MATIJE GUPCA KBR. 156ANÄAL LIDIJA, GAREĹ NICA, MATIJE GUPCA KBR. 156 " 

Aber es gibt nur Zeichenfolgen, die mit Buchstaben beginnen und nicht * Buchstaben Worte?

Antwort

2

Von Anfang an (^) der Zeichenfolge, wir passen null oder mehr * (\\**) gefolgt von einer Zahl ([0-9]) and negate `, um die Elemente zu extrahieren!.

my_column[!grepl("^(\\**[0-9])", my_column)] 
#[1] "CRKVENAC ANDRIJA, GAREL NICA KBR. 42CRKVENAC ANDRIJA, GAREL NICA KBR. 42 "          
#[2] "CRKVENAC LJUBICA ROÄ. VERTUL , GAREL NICA KBR. 42CRKVENAC LJUBICA ROÄ. VERTUL , GAREL NICA KBR. 42 "   
#[3] "*MUHVIĆ IVAN, ANTUNOV, GAREL NICA, MATIJE GUPCA 3*MUHVIĆ IVAN, ANTUNOV, GAREL NICA, MATIJE GUPCA 3 "   
#[4] "ANÄAL-MLINARIĆ BRIGITA, BJELOVAR, V. LISINSKOG KBR. 4ANÄAL-MLINARIĆ BRIGITA, BJELOVAR, V. LISINSKOG KBR. 4 " 
#[5] "ANÄAL LIDIJA, GAREL NICA, MATIJE GUPCA KBR. 156ANÄAL LIDIJA, GAREL NICA, MATIJE GUPCA KBR. 156 " 

Oder verwenden grep mit invert=TRUE,

grep("^(\\**[0-9])", my_column, invert=TRUE, value=TRUE) 
#[1] "CRKVENAC ANDRIJA, GAREL NICA KBR. 42CRKVENAC ANDRIJA, GAREL NICA KBR. 42 "          
#[2] "CRKVENAC LJUBICA ROÄ. VERTUL , GAREL NICA KBR. 42CRKVENAC LJUBICA ROÄ. VERTUL , GAREL NICA KBR. 42 "   
#[3] "*MUHVIĆ IVAN, ANTUNOV, GAREL NICA, MATIJE GUPCA 3*MUHVIĆ IVAN, ANTUNOV, GAREL NICA, MATIJE GUPCA 3 "   
#[4] "ANÄAL-MLINARIĆ BRIGITA, BJELOVAR, V. LISINSKOG KBR. 4ANÄAL-MLINARIĆ BRIGITA, BJELOVAR, V. LISINSKOG KBR. 4 " 
#[5] "ANÄAL LIDIJA, GAREL NICA, MATIJE GUPCA KBR. 156ANÄAL LIDIJA, GAREL NICA, MATIJE GUPCA KBR. 156 " 

HINWEIS: Auf der Grundlage der Post OP But it returns only strings that start with letter and not * letter words?

+0

Danke. Deine Lösung funktioniert. Warum hast du * zweimal benutzt? – Mislav

+0

@Mislav Da '*' ein Metazeichen ist, müssen wir '\\ *' entkommen und das zweite '*' ist ein Metazeichen, das 0 oder mehr '*' vorschlägt – akrun

4

Versuchen Sie dies mit:

x[!grepl("^\\*?\\d.*$", x)] 

[1] "CRKVENAC ANDRIJA, GAREL NICA KBR. 42CRKVENAC ANDRIJA, GAREL NICA KBR. 42 "          
[2] "CRKVENAC LJUBICA ROÄ. VERTUL , GAREL NICA KBR. 42CRKVENAC LJUBICA ROÄ. VERTUL , GAREL NICA KBR. 42 "   
[3] "*MUHVIĆ IVAN, ANTUNOV, GAREL NICA, MATIJE GUPCA 3*MUHVIĆ IVAN, ANTUNOV, GAREL NICA, MATIJE GUPCA 3 "   
[4] "ANÄAL-MLINARIĆ BRIGITA, BJELOVAR, V. LISINSKOG KBR. 4ANÄAL-MLINARIĆ BRIGITA, BJELOVAR, V. LISINSKOG KBR. 4 " 
[5] "ANÄAL LIDIJA, GAREL NICA, MATIJE GUPCA KBR. 156ANÄAL LIDIJA, GAREL NICA, MATIJE GUPCA KBR. 156 " 

Die Regex hier verwendet wird, ist:

^\\*?\\d.*$ 

Dies wird einen Eintrag in Ihrem Eingangsvektor entsprechen, die entweder mit einem Stern beginnt oder beginnt mit einem Sternchen gefolgt von einer Zahl (gefolgt von nichts anderem). Dieser resultierende logische Vektor ist dann negiert, weil Sie diese Zeichenfolgen nicht übereinstimmen möchten. Sie können diese regex erforschen hier:

Regex101

+1

op-Lösung bereits erledigt diese 'identisch (x [Grepl ("^(\\ d! | \\ *). * $ ", x)], x [grepl (" (? =^[^ \\ *] \\ D {2}) (? =^\ D) ", x, perl = TRUE)]) ## [1] TRUE' – rawr

+0

@raw Ich ging mit dem Titel der Frage, was sie nicht wirklich wollten. –

+0

mit '(\\ d | \\ * \\ d)' ist das gleiche wie '\\ *? \\ d' und das zweite ist schneller, falls Sie es nützlich finden –

Verwandte Themen