Comment rechercher et remplacer n-ième occurrence de mot dans une phrase à l'aide de python expression régulière?
À l'aide de python expression régulière seulement, comment trouver et remplacer n-ième occurrence de mot dans une phrase?
Par exemple:
str = 'cat goose mouse horse pig cat cow'
new_str = re.sub(r'cat', r'Bull', str)
new_str = re.sub(r'cat', r'Bull', str, 1)
new_str = re.sub(r'cat', r'Bull', str, 2)
J'ai une phrase ci-dessus où le mot "chat" apparaît deux fois dans la phrase. Je veux 2ème occurrence du 'chat' être modifié en 'Bull' en laissant 1er 'chat' mot intacte. Ma dernière phrase serait:
"cat goose souris, cheval, cochon Taureau vache". Dans mon code ci-dessus, j'ai essayé 3 différents moments ne pouvait pas obtenir ce que je voulais.
- Je pense que c'est mieux si vous divisez la chaîne, de compter des occurrences de
cat
et de retourner une liste modifiée avec lenth
on a remplacé. Peut-être un peu plus lent, mais qui n'est pas pour déplaire et sera certainement plus lisible qu'un poilu regexp.
Vous devez vous connecter pour publier un commentaire.
Utilisation d'anticipation négatif, comme ci-dessous.
DÉMO
^
Affirme que nous sommes au début.(?:(?!cat).)*
Correspond à tout caractère mais pas decat
, zéro ou plusieurs fois.cat
correspond à la premièrecat
sous-chaîne.(?:(?!cat).)*
Correspond à tout caractère mais pas decat
, zéro ou plusieurs fois.((?:(?!cat).)*cat(?:(?!cat).)*)
, de sorte que nous avons pu consulter ceux capturés caractères plus tard.cat
maintenant la seconde qui suitcat
string est assorti.OU
Modifier le nombre à l'intérieur de la
{}
pour remplacer la première ou la deuxième ou la nième occurrence de la chaînecat
Remplacer la troisième occurrence de la chaîne
cat
, mettre2
les accolades ..Jouer avec les regex ici ...
r'(cat.*?)cat'
?.
, il devrait y avoir aucune différence dans la mesure où je peux dire.- Je utiliser la fonction simple, qui répertorie tous les événements, récupère le n-ième position et l'utilise pour diviser chaîne d'origine en deux sous-chaînes. Ensuite, il remplace la première occurrence dans le deuxième sous-chaîne et les jointures des sous-chaînes de retour dans la nouvelle chaîne:
Pour ces variables:
sorties:
Notes:
Voici un moyen de le faire sans une regex:
Utilisation:
Je voudrais définir une fonction qui va travailler pour tous les regex:
Un exemple de travail:
La sortie:
Un autre exemple:
La sortie:
Vous pouvez faire correspondre les deux occurrences de "chat", garder tout ce qui est avant la deuxième occurrence (
\1
) et ajouter "Bull":Nous faire une seule substitution pour éviter de remplacer les quatrième, sixième, etc. l'apparition de "chat" (quand il y en a au moins quatre occurrences), comme l'a souligné Avinash Raj commentaire.
Si vous souhaitez remplacer le
n
-th accident et non pas le deuxième, utilisation:BTW, vous ne devez pas utiliser
str
comme un nom de variable, car il est un Python mot clé réservé.cat cat cat goose mouse cat
str
comme un nom de variable?Créer un repl fonction pour passer en
re.sub()
. Sauf que... le truc est d'en faire une classe de sorte que vous pouvez suivre le nombre d'appels.Puis l'utiliser comme ceci:
Je suis sûr qu'il ya un moyen plus malin pour éviter d'utiliser une classe, mais cela semblait simple suffit à expliquer. Aussi, assurez-vous de retour
match.expand()
que de simplement retourner la valeur de remplacement n'est pas techniquement correct de quelqu'un décide d'utiliser\1
type de modèles.Comment remplacer le
nth
needle
avecword
: