Cómo extraer con una expresión regular los 3 valores numéricos de coordenadas de esta cadena, ya sean coordenadas numéricas positivas o negativas.
import asyncio
import re
import time
from datetime import datetime
detection_timer = 0
detection_timer_increment = 5
detection_timer_change = 10
x, y, z = None, None, None
x_aux, y_aux, z_aux = 0, 0, 0
def get_coords(input_coords):
input_coords = input_coords.replace("@","0")
m = re.match(r".*:\s([-0-9.]*),\s([-0-9.]*),\s([-0-9.]*)$", input_coords)
if m:
return m.groups()
async def timer():
global x, y, z, x_aux, y_aux, z_aux
global input_coords
global detection_timer, detection_timer_change
detection_timer += detection_timer_increment
if(detection_timer >= detection_timer_change):
detection_timer = 0
r = get_coords(input_coords)
if r:
x_aux = x = float(r[0]) if r[0] else x
y_aux = y = float(r[1]) if r[1] else y
z_aux = z = float(r[2]) if r[2] else z
return x_aux, y_aux, z_aux
while True:
input_coords = "Coordenadas: @, 63, -5"
x_aux, y_aux, z_aux = asyncio.run(timer())
if(x_aux != None and y_aux != None and z_aux != None):
print(x_aux)
print(y_aux)
print(z_aux)
Aunque el código no funciona correctamente en caso de que sean coordenadas negativas o si hay más valores al final de la cadena, ¿cómo debo corregir esta expresión regular para que pueda capturar los valores de ejemplo que puse en el código?
“Coordenadas: @, 63, -5|hhhf♀” —-> esto debería extraer 0,63,-5
“Coordenadas: @, 63.5, -5.695|hhhf♀” —-> esto debería extraer 0,63.5,-5.695
“Coordenadas: @, hhkjkm♀-63ss, -5|hhhf♀” —-> esto debería extraer 0, -63, -5
“Coordenadas: -8, 63, -5 \n♀” —-> esto debería extraer -8,63,-5
“Coordenadas: @, 63, -5” —-> esto debería extraer 0,63,-5
davy.ai
Para corregir la expresión regular y capturar las coordenadas negativas y valores adicionales al final de la cadena, se deben realizar los siguientes cambios:
Explicación de los cambios:
– La clase de caracteres
[-0-9.]
coincide con cualquier número o punto decimal, así como el guion para números negativos.– El
.*
antes de la primer coordenada captura todos los caracteres antes de ella.–
(?:\|.*|$)
al final coincide con una barra vertical seguida de cualquier caracter (\|.*
) o el final de la cadena ($
), capturando efectivamente cualquier valor adicional después de las coordenadas. El?:
lo convierte en un grupo de no captura, ya que solo nos importan los tres valores de las coordenadas.Con estos cambios, la función corregida
get_coords
queda de la siguiente manera:Esto extraerá correctamente las coordenadas de la siguiente manera:
–
"Coordenadas: @, 63, -5|hhhf♀"
->("0", "63", "-5")
–
"Coordenadas: @, 63.5, -5.695|hhhf♀"
->("0", "63.5", "-5.695")
–
"Coordenadas: @, hhkjkm♀-63ss, -5|hhhf♀"
->("0", "-63", "-5")
–
"Coordenadas: -8, 63, -5 \n♀"
->("-8", "63", "-5")
–
"Coordenadas: @, 63, -5"
->("0", "63", "-5")