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.

Limpieza de cadenas dinámicamente

Estoy raspando una página web como un pequeño proyecto divertido mientras aprendo “puppeteer” y durante ese tiempo me he encontrado con un pequeño problema cuando se trata de limpiar una cadena para obtener datos “útiles”. He ideado algunos métodos sencillos para extraer los datos que quiero de ellos, pero me he encontrado con casos especiales que no sé cómo manejar de la mejor manera.

Toma esta cadena:

“Round 1 – Foo Bar (Nombre de la Escuela) sobre John (JC) Cena (Nombre Falso de la Escuela) (Otoño 1:19)”

Los datos que quiero obtener son los siguientes:

  • Nombre del ganador = Foo Bar
  • Escuela del ganador = (Nombre de la Escuela)
  • Nombre del perdedor = John Cena
  • Escuela del perdedor = Nombre Falso de la Escuela

“Round 1” y el “-” no me sirven y siguen la misma estructura en toda la aplicación. Entonces, usar el método de solo seleccionar el índice donde deberían estar estos elementos debería ser bastante fácil.

El índice más importante en esta cadena es donde se encuentra “sobre”. Una vez que encuentre eso, puedo buscar los índices alrededor de eso para encontrar dónde está el resto de la información que necesito.

let findOver = arr.indexOf(‘sobre’)
let winnerName = arr[over – 3].concat(‘ ‘, arr[over – 2])
let winnerSchool = summaryBreakUp[over – 1]

Esto funciona para la cadena de arriba, al menos para el lado izquierdo. Obtiene el nombre y apellido del ganador y los concatena.

Mi pregunta es, cuando la cadena no tiene el mismo estilo que el lado izquierdo, ¿cómo puedo tener en cuenta los casos especiales como el anterior?

Podría buscar todos los “( y )”, capturar todos los datos en ellos para obtener los “Nombres de la Escuela”, pero entonces tendría que buscar la manera de averiguar cuál es una escuela y cuál es un apodo.

Se agradecería cualquier dirección. También publicaré algunos ejemplos más por si alguien más quiere intentarlo.

Esto es una victoria sobre un oponente no especificado.
Michel Macontish (Fairview) sobre Desconocido (For.)
No se da la ronda.
John Heflin (Arlington) sobre Kid Aleatorio (Mistview) (Caída 1:59).
No se da la caída.
Round 2 – Logan Paul George (High School) sobre Dontae Inverse (Jackson County) (Dec 3-0).

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para manejar casos límite como el ejemplo dado, un enfoque posible podría ser crear una lista de palabras comunes que podrían indicar un nombre de escuela. Luego, al buscar las escuelas ganadoras y perdedoras, podemos buscar estas palabras y su texto circundante para determinar si es realmente un nombre de escuela. Por ejemplo:

    const schoolIndicators = ['High', 'Middle', 'Junior', 'Senior', 'School', 'Academy', 'Institute']
    
    let winnerSchool, loserSchool
    
    for(let i = 0; i < arr.length; i++) {
      if(arr[i].includes('(')) {
        const bracketedText = arr[i].replace(/[()]/g, '')
        if(schoolIndicators.some(word => bracketedText.includes(word))) {
          if(winnerName.includes(arr[i-1])) {
            winnerSchool = arr[i]
          } else {
            loserSchool = arr[i]
          }
        }
      }
    }
    

    Este código recorre cada palabra en el array de cadena y verifica si contiene paréntesis. Si lo hace, se extrae el texto dentro de los paréntesis y se comprueba si está en nuestra lista de indicadores de escuela. Si contiene uno de estos indicadores, verificamos las palabras circundantes para determinar si pertenece al ganador o perdedor.

    Este enfoque no es infalible y aún puede haber casos límite que no cubra. Sin embargo, proporciona un punto de partida para manejar algunas de las cadenas más complejas que podemos encontrar.

Comments are closed.