Suponiendo que tengo la siguiente cadena:
str = """ HELLO 1 Stop #$**& 5.02‼️ 16.1 regex 5 ,#2.3222 """
Quiero exportar todos los números, ya sea int o float después de la palabra "stop" sin distinción entre mayúsculas y minúsculas. por lo que los resultados esperados serán:
[5.02, 16.1, 5, 2.3222]
Lo más lejos que he llegado hasta ahora es usando PyPi regex de otra publicación aquí:
regex.compile(r'(?<=stop.*)\d+(?:\.\d+)?', regex.I)
pero esta expresión me da solo [5.02, 16.1]
Otro más, aunque con el módulo de regex
más nuevo:
(?:\G(?!\A)|Stop)\D+\K\d+(?:\.\d+)?
Vea una demostración en regex101.com .
En Python
, esto podría ser
import regex as re string = """ HELLO 1 Stop #$**& 5.02‼️ 16.1 regex 5 ,#2.3222 """ pattern = re.compile(r'(?:\G(?!\A)|Stop)\D+\K\d+(?:\.\d+)?') numbers = pattern.findall(string) print(numbers)
y rendiría
['5.02', '16.1', '5', '2.3222']
No nombre sus variables después de funciones incorporadas, como str
, list
, dict
y similares.
Si necesita ir más allá y limitar su búsqueda dentro de algunos límites (por ejemplo, todos los números entre Stop
y end
), también podría usar
(?:\G(?!\A)|Stop)(?:(?!end)\D)+\K\d+(?:\.\d+)? # ^^^ ^^^
Vea otra demostración en regex101.com .
Obtiene solo los primeros 2 números, ya que .*
no coincide con una nueva línea.
Puede agregar actualizar las banderas a regex.I | regex.S
para que el punto coincida con una nueva línea.
import regex text = """ HELLO 1 Stop #$**& 5.02‼️ 16.1 regex 5 ,#2.3222 """ pattern = regex.compile(r'(?<=\bstop\b.*)\d+(?:\.\d+)?', regex.I | regex.S) print(regex.findall(pattern, text))
Producción
['5.02', '16.1', '5', '2.3222']
Ver una demostración de Python
Si desea imprimir los números después de la palabra "stop", también puede usar python re
y match stop, y luego capturar en un grupo todo lo que sigue.
Luego puede tomar ese valor del grupo 1 y encontrar todos los números.
import re text = """ HELLO 1 Stop #$**& 5.02‼️ 16.1 regex 5 ,#2.3222 """ pattern = r"\bStop\b(.+)" m = re.search(pattern, text, re.S|re.I) if m: print(re.findall(r"\d+(?:\.\d+)*", m.group(1)))
Producción
['5.02', '16.1', '5', '2.3222']
Podrías usar:
inp = """ HELLO 1 Stop #$**& 5.02‼️ 16.1 regex 5 ,#2.3222""" nums = [] if re.search(r'\bstop\b', inp, flags=re.I): inp = re.sub(r'^.*?\bstop\b', '', inp, flags=re.S|re.I) nums = re.findall(r'\d+(?:\.\d+)?', inp) print(nums) # ['5.02', '16.1', '5', '2.3222']
La lógica if
anterior garantiza que solo intentemos completar la matriz de números si estamos seguros de que Stop
aparece en el texto de entrada. De lo contrario, la salida predeterminada es solo una matriz vacía. Si aparece Stop
, eliminamos la parte inicial de la cadena antes de usar re.findall
para encontrar todos los números que aparecen después.