2 votes

Comment trouver s'il y a un caractère suivant le mot en Python ?

Je suis en train d'apprendre et d'essayer regex sur une chaîne.

qui est "DBZ:00000*{6000}/ONE/REFFERRARO REF:FINE DOGS*"

Je cherche à trouver tous les REF dans cette chaîne. J'ai donc utilisé ceci:

import re

doom = 'REF'
boom = "DBZ:00000*{6000}/ONE/REFFERRARO REF:FINE DOGS*"

# print(i)
# print('Found "%s" in "%s" ->' % (i, boom), end='')
print(re.findall(r"\b" + doom + "*", boom))
if re.search(doom, boom):
    print("found")

Output:

['REFF','REF']

Ici, je n'obtiens pas le REF exact et ce que je veux faire est vérifier s'il y a un caractère à côté de "REF"

Comme: "REFFERRARO" -> Ici, à côté de "REF" se trouve "F" "REF:FINE" -> Ici, à côté de "REF" se trouve ":"

Donc, si je trouve autre chose que ":" à côté de "REF", je veux ajouter ":" après "REF".

Example:

Chaîne: "DBZ:00000*{6000}/ONE/REFFERRARO REF:FINE DOGS*"
Résultat: "DBZ:00000*{6000}/ONE/REF:FERRARO REF:FINE DOGS*"

MISE À JOUR:

Comme dit, j'ai utilisé .sub et obtenu ceci:

print(re.compile('REF').sub("REF:", boom))

Output:

"DBZ:00000*{6000}/ONE/REF:FERRARO REF::FINE DOGS*"

Nouvelle MISE À JOUR:

J'ai essayé ceci et ça a fonctionné (mais je ne pense pas que ce soit valide car s'il y a n nombre de "REFFERRARO" alors):

print(re.compile('REF').sub("REF:", boom,count=1))

1voto

Patrick Artner Points 29630

Votre motif de '\bREF*' cherche une limite de mot suivie de 'REF''F' peut être présent 0 à n fois. C'est ce que vous obtenez : 'REF' et 'REFF'

Vous voulez probablement r'\bREF.*\b'.

Pour substituer votre :, faites ceci :

import re

pattern = r'\bREF([^:])' # REF suivi de PAS un : - capturer le seul caractère

# \1 insère le seul caractère après REF sans :
correct = re.sub(pattern, r'REF:\1', "DBZ:00000*{6000}/ONE/REFFERRARO REF:FINE DOGS*")

print(correct)  

Sortie :

DBZ:00000*{6000}/ONE/REF:FERRARO REF:FINE DOGS*

1voto

M42 Points 31888

Voici une façon d'utiliser le lookaround:

import re

str = "DBZ:00000*{6000}/ONE/REFFERRARO REF:FINE DOGS*"
print(re.sub(r'(?<=\bREF)(?!:)', ':', str))

Explication:

(?<=\bREF)  # positive lookbehind, assurez-vous que nous avons REF avant
(?!:)       # negative lookahead, assurez-vous que nous n'avons pas de deux-points après

Démo & explication

0voto

0x464e Points 4176

Premièrement, pour corriger votre regex actuelle \bREF*
Vous appliquez le quantifieur * (correspondant zéro ou plusieurs fois) uniquement à la lettre F.
Je suppose que vous voulez en réalité l'appliquer à tout le mot, donc vous feriez \b(REF)*, ou peut-être même \b(?:REF)*.
?: indique que votre groupe () n'est pas un groupe de capture. Si vous ne savez pas encore ce que c'est, vous pouvez pratiquement oublier cela. Cela ne fera aucune différence dans votre cas, juste une information pour vos projets futurs.
Vous pourriez également utiliser + (correspondant une ou plusieurs fois) au lieu de *.

Et maintenant, comment vérifier s'il y a quelque chose à côté du dernier F.
Vous pourriez utiliser un lookahead positif par exemple \b(REF)+(?=:).

N'oubliez pas de consulter ce site web incroyable pour essayer différentes regex:
https://regex101.com/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X