Voici la façon la plus simple d'expliquer cela. Voici ce que j'utilise:
re.split('\W', 'foo/bar spam\neggs')
-> ['foo', 'bar', 'spam', 'eggs']
Voici ce que je veux:
someMethod('\W', 'foo/bar spam\neggs')
-> ['foo', '/', 'bar', ' ', 'spam', '\n', 'eggs']
La raison en est que je veux diviser une chaîne en jetons, la manipuler, puis la recomposer.
\W
? J'ai échoué sur Google.Réponses:
la source
['foo', '/bar', ' spam', '\neggs']
?re.split('% ', re.sub('% ', '%% ', '5.000% Additional Whatnot'))
->['5.000%', 'Additional Whatnot']
Si vous fractionnez sur la nouvelle ligne, utilisez
splitlines(True)
.(Pas une solution générale, mais l'ajouter ici au cas où quelqu'un viendrait ici sans se rendre compte que cette méthode existait.)
la source
Une autre solution sans regex qui fonctionne bien sur Python 3
la source
Si vous n'avez qu'un seul séparateur, vous pouvez utiliser des listes de compréhension:
Séparateur ajout / ajout:
Séparateur comme son propre élément:
la source
if x
pour vous assurer que le morceau produit parsplit
a du contenu, c'estresult = [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):]
un autre exemple, divisez sur non alphanumérique et gardez les séparateurs
production:
explication
la source
\W
c'est une façon plus compacte de l'exprimer.Vous pouvez également fractionner une chaîne avec un tableau de chaînes au lieu d'une expression régulière, comme ceci:
la source
la source
Une solution paresseuse et simple
Supposons que votre modèle d'expression régulière est
split_pattern = r'(!|\?)'
Tout d'abord, vous ajoutez un même caractère que le nouveau séparateur, comme «[couper]»
new_string = re.sub(split_pattern, '\\1[cut]', your_string)
Ensuite, vous divisez le nouveau séparateur,
new_string.split('[cut]')
la source
[cut]
quelque part.Si l'on veut diviser la chaîne tout en gardant les séparateurs par regex sans capturer le groupe:
Si l'on suppose que l'expression régulière est enveloppée dans un groupe de capture:
Les deux façons supprimeront également les groupes vides qui sont inutiles et ennuyeux dans la plupart des cas.
la source
Voici une
.split
solution simple qui fonctionne sans regex.Il s'agit d'une réponse pour Python split () sans supprimer le délimiteur , donc pas exactement ce que le message d'origine demande, mais l'autre question a été fermée en double pour celle-ci.
Tests aléatoires:
la source
J'ai eu un problème similaire en essayant de diviser un chemin de fichier et j'ai eu du mal à trouver une réponse simple. Cela a fonctionné pour moi et n'a pas nécessité de remplacer les délimiteurs dans le texte fractionné:
my_path = 'folder1/folder2/folder3/file1'
import re
re.findall('[^/]+/|[^/]+', my_path)
Retour:
['folder1/', 'folder2/', 'folder3/', 'file1']
la source
re.findall('[^/]+/?', my_path)
(par exemple, rendre la barre oblique facultative en utilisant un?
plutôt que de fournir deux alternatives avec|
.J'ai trouvé cette approche basée sur le générateur plus satisfaisante:
Cela évite d'avoir à trouver la bonne expression rationnelle, alors qu'en théorie, cela devrait être assez bon marché. Il ne crée pas de nouveaux objets chaîne et délègue la majeure partie du travail d'itération à la méthode de recherche efficace.
... et en Python 3.8, il peut être aussi court que:
la source
remplacer tout
seperator: (\W)
parseperator + new_seperator: (\W;)
divisé par le
new_seperator: (;)
la source