Aquí está la forma más simple de explicar esto. Esto es lo que estoy usando:
re.split('\W', 'foo/bar spam\neggs')
-> ['foo', 'bar', 'spam', 'eggs']
Esto es lo que quiero:
someMethod('\W', 'foo/bar spam\neggs')
-> ['foo', '/', 'bar', ' ', 'spam', '\n', 'eggs']
La razón es que quiero dividir una cadena en tokens, manipularla y luego volver a armarla.
\W
? Fallé en google.Respuestas:
fuente
['foo', '/bar', ' spam', '\neggs']
?re.split('% ', re.sub('% ', '%% ', '5.000% Additional Whatnot'))
->['5.000%', 'Additional Whatnot']
Si está dividiendo en nueva línea, use
splitlines(True)
.(No es una solución general, pero agregue esto aquí en caso de que alguien venga aquí sin darse cuenta de que este método existe).
fuente
Otra solución sin expresiones regulares que funciona bien en Python 3
fuente
Si solo tiene 1 separador, puede emplear listas de comprensión:
Separador anexado / antepuesto:
Separador como elemento propio:
fuente
if x
para asegurarse de que el fragmento producido porsplit
tiene algún contenido, es decirresult = [x + sep for x in text.split(sep) if x]
result = [sep+x for x in data.split(sep)]
result[0] = result[0][len(sep):]
otro ejemplo, dividir en no alfanumérico y mantener los separadores
salida:
explicación
fuente
\W
es una forma más compacta de expresarla.También puede dividir una cadena con una matriz de cadenas en lugar de una expresión regular, como esta:
fuente
fuente
Una solución perezosa y simple
Suponga que su patrón regex es
split_pattern = r'(!|\?)'
Primero, agrega el mismo carácter que el nuevo separador, como '[corte]'
new_string = re.sub(split_pattern, '\\1[cut]', your_string)
Luego divides el nuevo separador,
new_string.split('[cut]')
fuente
[cut]
algún lugar.Si se quiere dividir una cadena mientras se mantienen los separadores por expresiones regulares sin capturar el grupo:
Si se supone que la expresión regular está envuelta en el grupo de captura:
Ambas formas también eliminarán grupos vacíos que son inútiles y molestos en la mayoría de los casos.
fuente
Aquí hay una
.split
solución simple que funciona sin expresiones regulares.Esta es una respuesta para Python split () sin eliminar el delimitador , por lo que no es exactamente lo que pregunta la publicación original, pero la otra pregunta se cerró como un duplicado para esta.
Pruebas aleatorias:
fuente
Tuve un problema similar al tratar de dividir una ruta de archivo y luché por encontrar una respuesta simple. Esto funcionó para mí y no implicó tener que sustituir los delimitadores en el texto dividido:
my_path = 'folder1/folder2/folder3/file1'
import re
re.findall('[^/]+/|[^/]+', my_path)
devoluciones:
['folder1/', 'folder2/', 'folder3/', 'file1']
fuente
re.findall('[^/]+/?', my_path)
(por ejemplo, hacer que la barra inclinada final sea opcional usando un en?
lugar de proporcionar dos alternativas con|
.Encontré este enfoque basado en generador más satisfactorio:
Evita la necesidad de descubrir la expresión regular correcta, mientras que en teoría debería ser bastante barata. No crea nuevos objetos de cadena y delega la mayor parte del trabajo de iteración al método de búsqueda eficiente.
... y en Python 3.8 puede ser tan corto como:
fuente
reemplazar todo
seperator: (\W)
conseperator + new_seperator: (\W;)
dividido por el
new_seperator: (;)
fuente