Digamos que tengo una cadena 'gfgfdAAA1234ZZZuijjk'
y quiero extraer solo la '1234'
parte.
Solo sé cuáles serán los pocos personajes directamente antes AAA
y después de ZZZ
la parte que me interesa 1234
.
Con sed
esto es posible hacer algo como esto con una cadena:
echo "$STRING" | sed -e "s|.*AAA\(.*\)ZZZ.*|\1|"
Y esto me dará 1234
como resultado.
¿Cómo hacer lo mismo en Python?
Luego, también puede usar expresiones regulares con el módulo re, si lo desea, pero eso no es necesario en su caso.
fuente
re
método no es más rápido?s
,s.find
volverá-1
. el operador de cortes[begin:end]
lo aceptará como índice válido y devolverá una subcadena no deseada.expresión regular
Lo anterior tal como está fallará con un
AttributeError
si no hay "AAA" y "ZZZ" enyour_text
métodos de cadena
Lo anterior devolverá una cadena vacía si "AAA" o "ZZZ" no existen
your_text
.PS Python Challenge?
fuente
fuente
AttributeError: 'NoneType' object has no attribute 'groups'
- si no hay AAA, ZZZ en la cadena ...Sorprendido de que nadie haya mencionado esto, que es mi versión rápida para scripts únicos:
fuente
puedes hacerlo usando solo una línea de código
resultado recibirá lista ...
fuente
Puede usar re module para eso:
fuente
echo "$STRING" | sed -e "s|.*AAA\(.*\)ZZZ.*|\1|"
Podrías hacer lo mismo con la
re.sub
función usando la misma expresión regular.En sed básico, el grupo de captura está representado por
\(..\)
, pero en python sí(..)
.fuente
En python, la extracción de la cadena de formulario de subcadena se puede hacer usando el
findall
método en elre
módulo de expresión regular ( )fuente
fuente
fuente
Da
fuente
En caso de que alguien tenga que hacer lo mismo que yo hice. Tuve que extraer todo dentro del paréntesis en una línea. Por ejemplo, si tengo una línea como 'el presidente de los Estados Unidos (Barack Obama) se reunió con ...' y quiero obtener solo 'Barack Obama', esta es la solución:
Es decir, debe bloquear los paréntesis con
slash \
signo. Aunque es un problema sobre expresiones más regulares que Python.Además, en algunos casos puede ver los símbolos 'r' antes de la definición de expresiones regulares. Si no hay un prefijo r, debe usar caracteres de escape como en C. Aquí hay más discusión sobre eso.
fuente
Usando PyParsing
cuyos rendimientos:
[['1234']]
fuente
Aquí hay una solución sin expresiones regulares que también tiene en cuenta los escenarios donde la primera subcadena contiene la segunda subcadena. Esta función solo encontrará una subcadena si el segundo marcador está detrás del primer marcador.
fuente
Otra forma de hacerlo es mediante listas (suponiendo que la subcadena que está buscando esté compuesta únicamente de números):
fuente
Uno de los revestimientos que devuelve otra cadena si no hubo coincidencia. Editar: la versión mejorada usa la
next
función, reemplácela"not-found"
por otra si es necesario:Mi otro método para hacer esto, menos óptimo, usa regex por segunda vez, aún no encontré una forma más corta:
fuente