Mis cuerdas son algo así:

str1 = "3,5 of 5 stars"
str2 = "4 of 5 stars"

Quiero extraer el primer número de cada cadena.

Algo como eso:

str1 = 3,5
str2 = 4

El problema es que los números están en dos formatos (int y float)

Espero que puedan ayudarme

Gracias por tu ayuda

-2
Christian Rommel 13 ene. 2017 a las 16:54

5 respuestas

La mejor respuesta

Si hay un espacio antes del "of", puede usar ( evita la expresión regular ):

>>> print [item.split()[0] for item in [str1, str2]]
['3,5', '4']
0
ospahiu 13 ene. 2017 a las 14:16

Para unir números y flotantes (usando el delimitador ,) en una cadena, puede usar el módulo re:

>>> re.findall(r"[-+]?\d*\,\d+|\d+", "5,5 of 5 stars")
['5,5', '5']

>>> re.findall(r"[-+]?\d*\,\d+|\d+", "5,5 of 5 stars")[0]
'5,5'

>>> re.findall(r"[-+]?\d*\,\d+|\d+", "4 of 5 stars")[0]
'4'

He usado la expresión regular de esta respuesta de StackOverflow (de @miku) pero la modifiqué para usar , como delimitador en lugar de ..

0
Community 23 may. 2017 a las 10:29

Si el patrón de cadenas es siempre "X de estrellas Y", puede hacer lo siguiente:

str1 = "3,5 of 5 stars"
str2 = "4 of 5 stars"

lst = [str1, str2, ...]
nums = [float(x.split(' of ')[0].replace(',','.')) for x in lst]
print(nums)  # prints [3.5, 4.0]
0
Ev. Kounis 13 ene. 2017 a las 14:02

Supongo que su formato de cadena es - X of Y stars

Puedes extraer X de esta manera.

>>> my_str = "3,5 of 5 stars"
>>> my_str.strip().split(' ')[0]
'3,5'

Digamos que desea convertir 3,5 en flotante para hacer algunos cálculos matemáticos, luego reemplace , con . y luego envuelva float(...).

>>> float(my_str.strip().split(' ')[0].replace(',','.'))
3.5
0
Gurupad Mamadapur 13 ene. 2017 a las 14:14
string = "3 o 4 k 5"

for char in string:
    entry = ""
    try:
        entry = int(char)
    except:
        continue
    if entry != "":
        print entry
        break

Aquí está la explicación. El string contiene la cadena. Cuando comienza el ciclo for, char se establece en el primer carácter de la cadena. El bucle for intenta convertir el carácter en un entero. Si tiene éxito, significa que es el personaje un número. En ese caso, es el primer número que se encuentra, por lo que se emite y el ciclo se detiene.

Si la conversión falla, generará un error (por lo tanto, la parte except), pero dado que estamos utilizando try/except, el bucle saltará a su próximo carácter inmediatamente. El bucle for continuará hasta que se encuentre un número o no haya números en la cadena.

0
Anthony Pham 13 ene. 2017 a las 14:00