1
votes

impossible de faire correspondre la recherche regex à un nombre à 10 chiffres dans une chaîne

J'essaye d'extraire des nombres à 10 chiffres d'une chaîne en utilisant une regex sur un script python 3.7.

J'ai cette regex qui fonctionne plutôt bien quand le nombre est la chaîne entière:

>>> import re
>>> re.search(r'^(?=.{10}$)((11|351|2267|)(\d+))', '1153210611')
<re.Match object; span=(0, 10), match='1153210611'>
>>> re.search(r'^(?=.{10}$)((11|351|2267|)(\d+))', 'a1153210611b')
>>> re.search(r'(?=.{10})((11|351|2267|)(\d+))', 'a1153210611b')
<re.Match object; span=(1, 11), match='1153210611'>
>>> re.search(r'(?=.{10})((11|351|2267|)(\d+))', 'a115321061133b')
<re.Match object; span=(1, 13), match='115321061133'>

Cela correspond à des nombres entiers corrects comme 1153210611 ou 3514681255 , mais quand j'essaye de trouver des nombres comme celui-ci dans une chaîne, comme ' assd9 1153210611 83jdj 'il ne le trouve pas. Je suis presque sûr que cela a à voir avec ^ et $ et a essayé de le supprimer ou de changer sa position sans réussir. Lorsque je supprime ^ et $, cela correspond mais ne limite plus la longueur à 10.

^(?=.{10}$)((11|351|2267|)(\d+))

J'ai besoin d'extraire des nombres à 10 chiffres composés des chiffres initiaux avec longueur variable du premier groupe et complétée par les chiffres du deuxième groupe. Je dois ajouter d'autres choses ensuite, comme et en option +54 ou 54 avant le numéro, comme +541153210611 ou 541153210611 mais je ne veux pas continuer sans comprendre cela d'abord. Merci d'avance!


2 commentaires

Vous pouvez utiliser les 3 options et ajouter le nombre spécifique de chiffres (?: 11 \ d {8} | 351 \ d {7} | 2267 \ d {6}) Voir regex101.com/r/WmKaxH/1


Limitez simplement le minimum 10 caractères dans la tête de lecture aux chiffres (? = \ D {10}) ((11 | 351 | 2267 |) (\ d +)) Si vous veux seulement 10 chiffres et pas plus, c'est ce (?


3 Réponses :


0
votes

Regex101 :

<_sre.SRE_Match object; span=(5, 15), match='1153210611'>

Impressions: p>

s = 'assd9115321061183jdj'

import re

print( re.search(r'2267\d{6}|351\d{7}|11\d{8}', s) )


1 commentaires

Salut mon pote! C'est une excellente solution, très similaire à ce que le quatrième oiseau a suggéré. Comme je lui ai dit, j'ai essayé de simplifier le message avec quelques chiffres mais il y en a beaucoup plus. Je préférerais une solution similaire à ce que sln comme posté si c'est possible. Quoi qu'il en soit, je sais maintenant que cela pourrait être une solution si je ne pouvais pas la faire fonctionner dans l'autre sens. Merci.



0
votes

Les ancres ^ et $ affirmeront le début et la fin de la chaîne. Si vous les omettez, le \ d + correspondra à 1+ chiffres autant que possible.

Le modèle actuel utilise 3 groupes de capture. Si vous ne faites pas référence à ces groupes dans le code, vous pouvez utiliser le groupe non capturant (?: à la place.

Vous pouvez utiliser chaque option et compléter le nombre de chiffres pour devenir 10 au total.

(?:\+?54)?(?:11\d{8}|351\d{7}|2267\d{6})

Si vous souhaitez ajouter +54 ou 54, vous pouvez ajouter un groupe facultatif non capturant (?: \ +? 54)? code> au modèle pour faire correspondre un + facultatif suivi de 54

(?:11\d{8}|351\d{7}|2267\d{6})

Démo Regex


2 commentaires

Salut! Merci pour votre réponse. Oui, c'est exact, cela résoudrait parfaitement le problème. Le fait est qu'il y a beaucoup plus de chiffres et pas seulement ces trois. Désolé, j'ai essayé de simplifier le message et je ne savais pas que ce serait un problème plus tard. Je préférerais une façon de lui dire simplement la longueur une fois si c'est possible. Néanmoins, cela fonctionne parfaitement et c'est quelque chose que je peux utiliser si je ne pouvais pas comprendre comment le faire fonctionner dans l'autre sens. Merci pour votre temps.


@Johannes La raison pour laquelle j'ai opté pour cette approche est que, par exemple, dans cette chaîne assd9115321061183jdj vous voulez que la correspondance commence par 11. Dans ce cas, une limite devant elle l'empêchera de correspondre. D'un autre côté, pour chaque élément, vous voulez exactement 10 chiffres, mais il peut y avoir des chiffres après les 10 chiffres, donc \ d + le fera correspondre.



1
votes

Si vous ne voulez que 10 chiffres et pas plus, il s'agit de

(?

https: // regex101 .com / r / 5eXEld / 1

Expliqué

>>> import re
>>> re.search(r'(?<!\d)(?=\d{10}(?!\d))((11|351|2267|)(\d+))', '1153210611')
<re.Match object; span=(0, 10), match='1153210611'>
>>> re.search(r'(?<!\d)(?=\d{10}(?!\d))((11|351|2267|)(\d+))', 'a1153210611b')
<re.Match object; span=(1, 11), match='1153210611'>
>>> re.search(r'(?<!\d)(?=\d{10}(?!\d))((11|351|2267|)(\d+))', 'a1153210611b')
<re.Match object; span=(1, 11), match='1153210611'>
>>> re.search(r'(?<!\d)(?=\d{10}(?!\d))((11|351|2267|)(\d+))', 'a115321061133b')

Python

 (?<! \d )                     # Not a digit behind
 (?=                           # Exactly 10 digits ahead
      \d{10} 
      (?! \d )
 )
 (                             # (1 start)
      ( 11 | 351 | 2267 | )         # (2)
      ( \d+ )                       # (3)
 )                             # (1 end)

p>


1 commentaires

Désolé pour le retard ... Je ne m'attendais pas à une réponse aussi rapide! Merci pour cela ... Cette solution est géniale. Juste une chose ... Comment puis-je le régler pour que re.search trouve ce numéro 1153210611 dans le dernier exemple de chaîne «a 1153210611 33b»? Merci pour votre temps!