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å bokstaven B endast om det föregås av A , dvs "ABACADABRA" skulle matchas, men "abacadabra" och "aBacadabra" skulle inte.


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow