Tengo un código python simple que busca archivos en una cadena path=c:\path
, por ejemplo , donde la c:\path
parte puede variar. El código actual es:
def find_path(i_file):
lines = open(i_file).readlines()
for line in lines:
if line.startswith("Path="):
return # what to do here in order to get line content after "Path=" ?
¿Cuál es una manera simple de obtener el texto después Path=
?
Respuestas:
Comenzando
Python 3.9
, puedes usarremoveprefix
:fuente
Si la cadena es fija, simplemente puede usar:
que le da todo desde la posición 5 en adelante en la cadena (una cadena también es una secuencia, por lo que estos operadores de secuencia también funcionan aquí).
O puede dividir la línea al principio
=
:Entonces param es "Path" y el valor es el resto después de first =.
fuente
split
arroja una excepción si el delimitador no está presente.partition
es más estable, también divide una cadena y siempre devuelve una tupla de tres elementos con pre, delimitador y contenido posterior (algunos de los cuales pueden ser''
si el delimitador no estaba presente). Ejvalue = line.partition('=')
.Eliminar el prefijo de una cadena
Split en la primera aparición del separador a través de
str.partition()
Analizar archivos tipo INI con ConfigParser
Otras opciones
str.split()
re.match()
fuente
fuente
Para cortar (condicional o no condicional) en general, prefiero lo que sugirió recientemente un colega; Use reemplazo con una cadena vacía. Es más fácil leer el código, menos código (a veces) y menos riesgo de especificar el número incorrecto de caracteres. Okay; No uso Python, pero en otros idiomas prefiero este enfoque:
o - para seguir el primer comentario de esta publicación - si esto solo se debe hacer si la línea comienza con
Path
:La principal diferencia con algo de lo que se ha sugerido anteriormente es que no hay un "número mágico" (5) involucrado, ni ninguna necesidad de especificar tanto '
5
' como la cadena 'Path=
'. En otras palabras, prefiero este enfoque desde un mantenimiento de código punto de vista.fuente
rightmost = re.sub('^Path=', '', fullPath)
. El propósito delcompile()
método es hacer las cosas más rápido si reutiliza el objeto compilado, pero dado que lo tira después de usarlo, no tiene ningún efecto aquí de todos modos. Por lo general, no vale la pena preocuparse por esta optimización de todos modos.Prefiero
pop
indexar[-1]
:a
fuente
startswith
ya se ha probado, porsplit
lo que dividirá "nada" antes y todo lo demás después.split("Path=", 1)
es más preciso (en caso de que el prefijo vuelva a aparecer más adelante en la cadena) pero reintroduce un número mágico.O porque no
fuente
Qué tal si..
Este triplete es la cabeza, el separador y la cola .
fuente
La forma más simple en que puedo pensar es en cortar:
Una nota rápida sobre la notación de corte, utiliza dos índices en lugar del habitual. El primer índice indica el primer elemento de la secuencia que desea incluir en el segmento y el último índice es el índice inmediatamente posterior al último elemento que desea incluir en el segmento.
P.ej:
El segmento consta de todos los elementos entre
first_index
ylast_index
, incluidosfirst_index
y nolast_index
. Si se omite el primer índice, el valor predeterminado es el inicio de la secuencia. Si se omite el último índice, incluye todos los elementos hasta el último elemento de la secuencia. Los índices negativos también están permitidos. Use Google para aprender más sobre el tema.fuente
fuente
r''
cadenas para las rutas de Windows. 2.re.match()
puede devolver NoneOtra línea simple que no se ha mencionado aquí:
Esto también funcionará correctamente para varios casos extremos:
fuente
te da personajes después de los primeros cinco.
fuente
line[5:]
le dará la subcadena que desee. Busque la introducción y busque 'notación de corte'fuente
Si conoce la lista de comprensiones:
fuente
line.startswith(...)
es 10 veces más rápido. Mi prueba no confirmó esto. Feliz de cambiarlo si se proporciona evidencia que respalde esa afirmación.La versión pop no estaba del todo bien. Creo que quieres:
fuente
¿Por qué no usar regex con escape?
^
coincide con la parte inicial de una línea yre.MULTILINE
coincide con cada línea.re.escape
asegura que la coincidencia sea exacta.fuente
Intenta seguir el código
fuente
Supongo que esto es lo que estás buscando exactamente
fuente
sin tener que escribir una función, esto se dividirá de acuerdo a la lista, en este caso 'Mr. | Dr. | Mrs.', seleccione todo después de dividir con [1], luego divida nuevamente y tome cualquier elemento. En el caso a continuación, se devuelve 'Morris'.
fuente
Esto es muy similar en técnica a otras respuestas, pero sin operaciones de cadena repetidas, capacidad para saber si el prefijo estaba allí o no, y aún es bastante legible:
fuente