J'ai les scénarios suivants:
\bON\b(?=[\s{0,1}\"{0,1}\'{0,1}]$)
Je veux faire correspondre le mot ON dans les trois premiers scénarios, et pas dans les autres.
J'ai essayé avec des lookaheads positifs / négatifs / derrière en vain. ex:
message: ON message: "ON" message: 'ON' message: "TONC" message: Los Angeles, ON message: HOLDS ON FILE
5 Réponses :
Je recommande de munging la chaîne pour éliminer les choses que vous ne voulez pas plutôt que d'essayer de faire correspondre directement. Ici, je supprime simplement les caractères non alpha et je compare avec le résultat souhaité:
#!/usr/bin/env python3 import re tests = ['message: ON', 'message: "ON"', 'message: \'ON\'', 'message: "TONC"', 'message: Los Angeles, ON', 'message: HOLDS ON FILE'] for test in tests: test = re.sub(r'\W+', '', test) print(test) print(test == "messageON")
Votre question semble très claire; Je suggère simplement que ne pas utiliser re.match permet une solution beaucoup plus claire ici.
Cela correspond également à % & $ & / message! -., ON ° ˘˛ ^ ° ˛˘
Bien sûr, c'est le cas, mais c'est BEAUCOUP plus facile à lire qu'un regard en arrière, et j'ai abordé tous les tests échouants donnés dans l'invite.
Vous pouvez utiliser
r'''(?<=:\s)(["']?)\bON\b\1'''
Détails
(? - un regard positif qui correspond à un emplacement immédiatement précédé de : et d'un caractère d'espacement (["']?) - Groupe 1: un caractère " ou ' \ bON \ b - mot entier ON \ 1 - Référence arrière à la valeur du groupe 1, soit " ou '. REMARQUE : S'il peut y avoir une quantité variable d'espaces blancs entre : et le mot ON , vous pouvez utiliser module PyPi regex et utilisez r '' '(? motif.
% c5% bcew Que voulez-vous dire par Backreference au groupe 1 . Je n'ai pas compris ce point.
@YasserKhalil N'utilisez pas % c5% bcew , utilisez @ + username ( @ WiktorStribiżew dans mon cas). La référence arrière est l'espace réservé pour une valeur de texte capturée avec le groupe de capture correspondant.
Votre nom a des caractères spéciaux :) Merci beaucoup pour la réponse.
@YasserKhalil Tapez simplement @ , vous obtiendrez des suggestions automatiques.
Je n'ai pas reçu les suggestions automatiques et je ne sais pas pourquoi ..?
Parce que dans ce cas, puisque vous ajoutez des commentaires sous mon message, vous n'avez pas besoin de la mention, je reçois des notifications dans tous les cas.
En gros, j'ajoute simplement message: dans l'expression régulière ( r '^ message: ["\']? \ bON \ b [" \ ']? $' ):
$ ./regex_to_find_exact_match.py message: ON It's a match ! message: "ON" It's a match ! message: 'ON' It's a match !
et ça marche, voici le résultat:
#!/usr/bin/env python3
from re import search
strings = [
'message: ON',
'message: "ON"',
'message: \'ON\'',
'message: "TONC"',
'message: Los Angeles, ON',
'message: HOLDS ON FILE',
]
for s in strings:
m = search(r'^message: ["\']?\bON\b["\']?$', s)
if m is not None:
print(s)
print("It's a match !")
Si vous ne voulez faire correspondre que ON , une autre option consiste à utiliser une alternance correspondant soit entre un deux-points suivi d'un espace et une limite d'espace blanc à droite ou entre le même type de guillemets.
(?<=: )ON(?!\S)|(?<=: (['"]))ON(?=\1)
(? Affirmation de : et espace à gauche ON Match ON (?! \ S) Affirmer une limite d'espace blanc à droite | Ou (? Affirmer : et l'espace à gauche et capturer dans le groupe 1 ' ou " ON Match ON (? = \ 1) Affirmez à droite la même citation qui correspond au groupe 1 en utilisant une référence arrière
Pour info,
{0,1}équivaut à?.Peut-être que
(? <=: \ S) (["']?) \ BON \ b \ 1? Voir démo .ouais essayé? aussi bien @ 0x5453