Expression régulière pour la chaîne hexadécimale en python ne fonctionne pas
J'ai une expression régulière correspondant aux chaînes de caractères comme:
--D2CBA65440D
--77094A27E09
--77094A27E
--770
--77094A27E09--
en gros, elle correspond à une chaîne hexadécimale entouré par un ou plusieurs sauts de ligne ou un espace blanc, et a le préfixe -- et peut ou peut ne pas avoir-comme le suffixe
- je utiliser le code python suivant, et il fonctionne très bien la plupart du temps:
hexaPattern = "\s--[0-9a-fA-F]+[--]?\s"
hex = re.search(hexaPattern, part)
if hex:
print "found a match"
cela fonctionne pour tous les ci-dessus mais il ne correspond pas --77094A27E09 dans ce bloc:
<div id="arrow2" class="headerLinksImg" style="display:block
--77094A27E09
;">
mais correspond à la même chaîne:
<input type="checkbox" name="checkbox" id="checkboxKG3" class
--77094A27E09
Content-T="checkboxKG" value="KG3" />
Ce que je fais mal?
essayez de coupe vers le bas le code html de chaque côté jusqu'à ce que vous trouver le personnage qui est à l'origine du problème
Je reçois un match pour ce block: rubular.com/r/wfqgEPHObB
Notez que
je voulais dire deux tirets ... mais
Je reçois un match pour ce block: rubular.com/r/wfqgEPHObB
Notez que
[--]?
correspond à un seul ou aucun des tirets, pas deux tirets. Je pense que vous vouliez dire (--)?
je voulais dire deux tirets ... mais
[--]?
travailléOriginalL'auteur Darth Plagueis | 2012-04-22
Vous devez vous connecter pour publier un commentaire.
Cette pré-compile le modèle pour la vitesse. Il utilise un
r''
(chaîne brute) de sorte que les barres obliques inverses sont sûr d'être passé à travers correctement. Cela ajoute des parenthèses pour faire un "match de groupe" de sorte que vous pouvez extraire votre chaîne hexadécimale après le match; il ajoute également un "non-correspondants de groupe" autour de la deuxième--
chaîne.Parce que vous avez utilisé les crochets autour de la deuxième "--", vous avez un "caractère de classe". Je ne suis pas sûr exactement ce que le caractère de classe
[--]
matchs; je pense qu'il devrait tout simplement correspondre tout'-'
caractère. Dans une classe de caractères, un " - " est généralement utilisé pour un éventail, comme dans[a-z]
mais la gamme[--]
n'a pas de sens donc je pense qu'il devrait revenir à la juste contrepartie d'une'-'
. Le problème, c'est: parce que vous avez la?
après elle, il ne correspond à zéro ou à un'-'
caractère, et vous en avez besoin pour être en mesure de faire correspondre les deux.OriginalL'auteur steveha
Essayez ceci:
hexaPattern = r"^--[0-9a-fA-F]+(--)?\s"
Les correctifs j'ai inséré:
r au début, de sorte que les barres obliques inverses de ne pas être "mangé" par les guillemets
^ au début de match au début de la chaîne
puis
--
entre parenthèses au lieu des crochets (crochets sembler comme une erreur)Ok. Les exemples l'ont montré les motifs depuis le début
OriginalL'auteur Israel Unterman
D'autres ont signalé des problèmes avec votre regex, à savoir la
[--]
qui trouve essentiellement un seul trait d'union d'une manière non conventionnelle ... de toute façon, pas ce que vous voulez de toute façon.Je dirais aussi que le fait d'avoir
\s
à la fois le début et la fin de la regex sera également causer des problèmes dans certaines circonstances, car elle correspond àspaces
,tabs
, etnewlines
. Donc, vous pourriez vous retrouver avec un cas où votre dossier a--77094A27E09\n--D2CBA65440D
et la deuxième--D2CBA65440D
ne correspond pas parce que le saut de ligne a été consommé par\s
à la fin du match précédent.Aussi, vous semblez être la vérification de chaque ligne dans le fichier individuellement, ce qui vous n'avez pas vraiment besoin de le faire. Vous pouvez utiliser
re.findall
pour obtenir tous les matches d'un seul coup.Et enfin
--
au début de la chaîne semble être votre véritable marqueur, pas\s
au début ou à la fin. Alors pourquoi ne pas utiliser--([0-9a-fA-F]+)(?:--)?
avec un groupe autour du nombre hexadécimal.findall
renvoie uniquement les groupes qui est ce que vous voulez. Ensuite, vous pouvez le faire (lire tout le fichier html dans une chaîne de caractères, et de vérifier tous les matchs):Qui, je pense, est ce que vous voulez
OriginalL'auteur alan
J'ai utilisé les éléments suivants :
et il a bien fonctionné. Merci à tous de vos contributions.
^
comme Israël mentionnées à trouver au début d'une ligne.OriginalL'auteur Darth Plagueis