es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , , , ,

Answer

  1. Avatar for 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:

    m = re.match(r".*:\s*([-0-9.]*?)\s*,\s*([-0-9.]*?)\s*,\s*([-0-9.]*?)(?:\|.*|$)", input_coords)
    

    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:

    def get_coords(input_coords):
        input_coords = input_coords.replace("@", "0")
        m = re.match(r".*:\s*([-0-9.]*?)\s*,\s*([-0-9.]*?)\s*,\s*([-0-9.]*?)(?:\|.*|$)", input_coords)
        if m:
            return m.groups()
    

    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")

Comments are closed.