Regulární výraz odpovídající vzor a ohraničené řetězce

0

Otázka

Snažím se nahradit (technicky odstranit) úroveň složek z vektoru cesta k souboru strings. Data vypadají takto:

x<-c("d:/KeepItSimple/1234path21/WAVs/filename.wav",
     "d:/TryToKeepItSimple/5678path23/WAVs/filename2.wav")

Chtěl bych využít gsub a regex najít vzor "cesta" v každém řetězci a nahradit řetězec obsahující "cestu" mezi dvě lomítka nic. V podstatě stačí odstranit tuto složku úrovni. Můžete předpokládat, že počet znaků pro pojmenování této složky úrovni, bude vždy obsahovat "cestu" a bude vždy 10 znaků (mezi lomítka).

Po nějaké hlavy poškrábání jsem přišel s tímto:

 gsub(".{4}path.{2}", "", x)

To funguje, ale mě to nechává dvě otázky:

  1. Existuje lepší způsob, jak vyjádřit/dosáhnout v regex.
  2. Jak jsem to mohl udělat tak, že by podívejte se na vše, co na první /, než "cesta" a další / po "cestě"?
gsub r regex
2021-11-24 03:37:11
2

Nejlepší odpověď

3

Můžete použít sub zde takto:

x <- c("d:/KeepItSimple/1234path21/WAVs/filename.wav",
       "d:/TryToKeepItSimple/5678path23/WAVs/filename2.wav")
output <- sub("/?[^/]*path[^/]*/?", "/", x)
output

[1] "d:/KeepItSimple/WAVs/filename.wav"      
[2] "d:/TryToKeepItSimple/WAVs/filename2.wav"
2021-11-24 03:53:08
2

Moje pochopení je, že text, který má být nahrazen prázdný řetězec musí splňovat čtyři požadavky. To

  • je okamžitě následuje lomítko;
  • obsahuje lomítko, které je na konci řetězce;
  • obsahuje 11 znaků; a
  • obsahuje řetězec "cesta"

Můžeme zápas jako řetězec s následující regulární výraz.

(?<=\/)(?=[^\/\n]{0,6}path)[^\/]{10}\/

Demo

Regulární výrazy mohou být rozděleny následovně.

(?<=\/)         # positive lookbehind asserts match is preceded by a forward slash  
(?=             # begin positive lookahead
  [^\/\n]{0,6}  # match zero to 6 characters other than forward slashes and newlines
  path          # match literal
)               # end positive lookahead
[^\/\n]{10}     # match 10 characters other than forward slashes and newlines 
\/              # match a forward slash
2021-11-24 08:02:25

To však odpověď na otázku, a já opravdu oceňuji rozpis, co regex výraz znamená.
TBP

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................