R Language
Regular Expressions (regex)
Sök…
Introduktion
Regelbundna uttryck (även kallad "regex" eller "regexp") definierar mönster som kan matchas mot en sträng . Skriv ?regex
för den officiella R-dokumentationen och se Regex Docs för mer information. Det viktigaste 'gotcha' som inte kommer att lära sig i SO regex / ämnen är att de flesta R-regex-funktioner behöver använda parade backstänger för att komma i en pattern
.
Anmärkningar
Karaktär klasser
-
"[AB]"
kan vara A eller B -
"[[:alpha:]]"
kan vara vilken bokstav som helst -
"[[:lower:]]"
står för alla små bokstäver. Observera att"[az]"
är nära men inte stämmer, t exú
. -
"[[:upper:]]"
står för alla stora bokstäver. Observera att"[AZ]"
är nära men inte matchar, t.ex.Ú
. -
"[[:digit:]]"
står för vilken siffra som helst: 0, 1, 2, ... eller 9 och motsvarar"[0-9]"
.
Kvantifierare
+
, *
och ?
applicera som vanligt i regex. - +
matcher minst en gång, *
matchar 0 eller flera gånger, och ?
matchar 0 eller 1 gång.
Start och slut på radindikatorerna
Du kan ange positionen för regex i strängen:
-
"^..."
tvingar det reguljära uttrycket att vara i början av strängen -
"...$"
tvingar det reguljära uttrycket att vara i slutet av strängen
Skillnader från andra språk
Observera att vanliga uttryck i R ofta ser allt så annorlunda ut än vanliga uttryck som används på andra språk.
R kräver dubbel-backslash-flykt (eftersom
"\"
redan förutsätter att fly i allmänhet i R-strängar), så till exempel för att fånga vitrum i de flesta vanliga expressionsmotorer behöver man helt enkelt skriva\s
, kontra\\s
i R .UTF-8-tecken i R bör flydas med en stor U, t.ex.
[\U{1F600}]
och[\U1F600]
matchning whereas, medan i till exempel Ruby skulle detta matchas med en liten bokstav u.
Ytterligare resurser
Följande webbplats reg101 är ett bra ställe att kontrollera online-regex innan du använder det R-script.
R-programmeringswikiboken har en sida avsedd för textbehandling med många exempel med vanliga uttryck.
Att eliminera Whitespace
string <- ' some text on line one;
and then some text on line two '
Trimning av Whitespace
"Trimning" -avstånd refererar vanligtvis till att ta bort både ledande och släpande mellanrum från en sträng. Detta kan göras med hjälp av en kombination av de tidigare exemplen. gsub
används för att tvinga ersättningen över både ledande och bakre tändstickor.
Innan R 3.2.0
gsub(pattern = "(^ +| +$)",
replacement = "",
x = string)
[1] "some text on line one; \nand then some text on line two"
R 3.2.0 och högre
trimws(x = string)
[1] "some text on line one; \nand then some text on line two"
Ta bort ledande vitrum
Innan R 3.2.0
sub(pattern = "^ +",
replacement = "",
x = string)
[1] "some text on line one; \nand then some text on line two "
R 3.2.0 och högre
trimws(x = string,
which = "left")
[1] "some text on line one; \nand then some text on line two "
Ta bort släpande vitrum
Innan R 3.2.0
sub(pattern = " +$",
replacement = "",
x = string)
[1] " some text on line one; \nand then some text on line two"
R 3.2.0 och högre
trimws(x = string,
which = "right")
[1] " some text on line one; \nand then some text on line two"
Ta bort allt vitrum
gsub(pattern = "\\s",
replacement = "",
x = string)
[1] "sometextonlineone;andthensometextonlinetwo"
Observera att detta också tar bort vitrumstecken som flikar ( \t
), nylinjer ( \r
och \n
) och mellanslag.
Validera ett datum i "ÅÅÅÅMMDD" -format
Det är vanligt att namnge filer med datumet som prefix i följande format: YYYYMMDD
, till exempel: 20170101_results.csv
. Ett datum i sådant strängformat kan verifieras med hjälp av följande reguljära uttryck:
\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])
Ovanstående uttryck beaktar datum från år: 0000-9999
, månader mellan: 01-12
och dagar 01-31
.
Till exempel:
> grepl("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])", "20170101")
[1] TRUE
> grepl("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])", "20171206")
[1] TRUE
> grepl("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])", "29991231")
[1] TRUE
Obs : Det validerar datumsyntaxen, men vi kan ha fel datum med en giltig syntax, till exempel: 20170229
(2017 är det inte ett skottår).
> grepl("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])", "20170229")
[1] TRUE
Om du vill validera ett datum kan det göras via den här användardefinierade funktionen:
is.Date <- function(x) {return(!is.na(as.Date(as.character(x), format = '%Y%m%d')))}
Sedan
> is.Date(c("20170229", "20170101", 20170101))
[1] FALSE TRUE TRUE
Validera amerikanska postförkortningar
Följande regex
inkluderar 50 stater och även Commonwealth / Territory (se www.50states.com ):
regex <- "(A[LKSZR])|(C[AOT])|(D[EC])|(F[ML])|(G[AU])|(HI)|(I[DLNA])|(K[SY])|(LA)|(M[EHDAINSOT])|(N[EVHJMYCD])|(MP)|(O[HKR])|(P[WAR])|(RI)|(S[CD])|(T[NX])|(UT)|(V[TIA])|(W[AVIY])"
Till exempel:
> test <- c("AL", "AZ", "AR", "AJ", "AS", "DC", "FM", "GU","PW", "FL", "AJ", "AP")
> grepl(us.states.pattern, test)
[1] TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE
>
Obs :
Om du bara vill verifiera de 50 staterna rekommenderar vi att du använder R-dataset: state.abb
från state
, till exempel:
> data(state)
> test %in% state.abb
[1] TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE
Vi får TRUE
endast för 50-stater förkortningar: AL, AZ, AR, FL
.
Validera amerikanska telefonnummer
Följande regelbundna uttryck:
us.phones.regex <- "^\\s*(\\+\\s*1(-?|\\s+))*[0-9]{3}\\s*-?\\s*[0-9]{3}\\s*-?\\s*[0-9]{4}$"
Validerar ett telefonnummer i form av: +1-xxx-xxx-xxxx
, inklusive valfria ledande / släpande ämnen i början / slutet av varje grupp med nummer, men inte i mitten, till exempel: +1-xxx-xxx-xx xx
är inte giltigt. Den -
avgränsare kan ersättas med blank: xxx xxx xxx
eller utan avgränsare: xxxxxxxxxx
. Prefixet +1
är valfritt.
Låt oss kolla det:
us.phones.regex <- "^\\s*(\\+\\s*1(-?|\\s+))*[0-9]{3}\\s*-?\\s*[0-9]{3}\\s*-?\\s*[0-9]{4}$"
phones.OK <- c("305-123-4567", "305 123 4567", "+1-786-123-4567",
"+1 786 123 4567", "7861234567", "786 - 123 4567", "+ 1 786 - 123 4567")
phones.NOK <- c("124-456-78901", "124-456-789", "124-456-78 90",
"124-45 6-7890", "12 4-456-7890")
Giltiga fall:
> grepl(us.phones.regex, phones.OK)
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
>
Ogiltiga fall:
> grepl(us.phones.regex, phones.NOK)
[1] FALSE FALSE FALSE FALSE FALSE
>
Obs :
-
\\s
Matchar utrymme, flik eller nylinjetecken
Rymmande tecken i R-regexmönster
Eftersom både R och regex delar flykteckenet, "\"
, behöver man ofta bygga korrekta mönster för grep
, sub
, gsub
eller någon annan funktion som accepterar ett mönsterargument. Om du bygger en teckenvektor med tre objekt där ett objekt har en radmatning, en annan en flikkaraktär och en inte heller, och önskan är att förvandla antingen linjematningen eller fliken till fyra rymden, då behövs en enda backslash för konstruktionen, men parade backstreck för matchning:
x <- c( "a\nb", "c\td", "e f")
x # how it's stored
# [1] "a\nb" "c\td" "e f"
cat(x) # how it will be seen with cat
#a
#b c d e f
gsub(patt="\\n|\\t", repl=" ", x)
#[1] "a b" "c d" "e f"
Observera att mönsterargumentet (som är valfritt om det visas först och endast behöver delvis stavning) är det enda argumentet som kräver denna fördubbling eller parning. Ersättningsargumentet kräver inte fördubbling av tecken som behöver undkommas. Om du vill att alla linjefötter och fyra-rymden skulle ersättas med flikar skulle det vara:
gsub("\\n| ", "\t", x)
#[1] "a\tb" "c\td" "e\tf"
Skillnader mellan Perl och POSIX regex
Det finns två någonsin så lite olika motorer med reguljära uttryck implementerade i R. Standardvärdet kallas POSIX-konsistent; alla regex-funktioner i R är också utrustade med ett alternativ för att slå på den senare typen: perl = TRUE
.
Look-ahead / look-bakom
perl = TRUE
möjliggör blick framåt och bakåt i regelbundna uttryck.
-
"(?<=A)B"
matchar ett utseende på bokstavenB
endast om det föregås avA
, dvs"ABACADABRA"
skulle matchas, men"abacadabra"
och"aBacadabra"
skulle inte.