tutorial tag simple regulares regular expresiones examples regex r gsub

tag - Regex devuelve el nombre del archivo, elimina la ruta y la extensión del archivo



simple regex (2)

En primer lugar, para deshacerte de la "ruta principal", puedes usar basename . Para eliminar la extensión, puede usar sub similar a su descripción en su pregunta:

filenames <- sub("//.[[:alnum:]]+$", "", basename(as.character(df$fileNames)))

Tenga en cuenta que debe usar sub lugar de gsub aquí, porque la extensión del archivo solo puede ocurrir una vez para cada nombre de archivo. Además, debes usar //. que coincide con un punto en lugar de . que coincide con cualquier símbolo. Finalmente, debe agregar $ al patrón para asegurarse de que está eliminando la extensión solo si está al final del nombre de archivo.

Edición: la función file_path_sans_ext sugerida en la solución de Ananda Mahto funciona a través de sub("([^.]+)//.[[:alnum:]]+$", "//1", x) , es decir , en lugar de eliminar el extensión como arriba, la parte que no es extensión del nombre de archivo se conserva. No puedo ver ninguna ventaja o desventaja específica de ambos métodos en el caso del OP .

Tengo un data.frame que contiene una columna de texto de nombres de archivos. Me gustaría devolver el nombre del archivo sin la ruta o la extensión del archivo. Normalmente, mis nombres de archivo han sido numerados, pero no tienen que serlo. Por ejemplo:

df<-data.frame(data=c("a","b"),fileNames=c("C:/a/bb/ccc/NAME1.ext","C:/a/bb/ccc/d D2/name2.ext"))

Me gustaría devolver el equivalente de

df<-data.frame(data=c("a","b"),fileNames=c("NAME","name"))

pero no puedo entender la expresión regular para hacer esto con gsub. Por ejemplo, puedo deshacerme de la extensión con (siempre que el nombre del archivo termine con un número):

gsub(''([0-9]).ext'','''',df[,"fileNames"])

Aunque he estado probando varios patrones (leyendo los archivos de ayuda de expresiones regulares y soluciones similares en este sitio), no puedo obtener una expresión regular para devolver el texto entre la última "/" y la primera ".". ¡Cualquier pensamiento o remisión a preguntas similares son muy apreciados!

Lo mejor que he conseguido es:

gsub(''*[[:graph:]_]/|*[[:graph:]_].ext'','''',df[,"fileNames"])

Pero este 1) no elimina todos los caracteres de ruta principales y 2) depende de una extensión de archivo específica.


Quizás esto te acerque más a tu solución:

library(tools) basename(file_path_sans_ext(df$fileNames)) # [1] "NAME1" "name2"

La función file_path_sans_ext es del paquete de "herramientas" (que creo que generalmente viene con R), y que extraerá la ruta hasta (pero sin incluir) la extensión. La función de basename se deshará de la información de su ruta.

O, para tomar de file_path_sans_ext y modificarlo un poco, puedes intentar:

sub("(.*///)([^.]+)(//.[[:alnum:]]+$)", "//2", df$fileNames) # [1] "NAME1" "name2"

Aquí, "capturé" las tres partes de las variables "fileNames", por lo que si quisiera solo las rutas del archivo, cambiaría "//2" a "//1" , y si quisiera solo las extensiones de archivo , lo cambiarías a "//3" .