web-dev-qa-db-fra.com

Rechercher des numéros de téléphone dans un script python

le script python suivant me permet d'extraire les adresses électroniques d'un fichier donné à l'aide d'expressions régulières. 

Comment puis-je ajouter quelque chose pour pouvoir également obtenir des numéros de téléphone? Disons, si c’était soit le chiffre 7 ou le chiffre 10 (avec l’indicatif régional), et tenait également compte de la parenthèse? 

Mon script actuel peut être trouvé ci-dessous:

# filename variables
filename = 'file.txt'
newfilename = 'result.txt'

# read the file
if os.path.exists(filename):
        data = open(filename,'r')
        bulkemails = data.read()
else:
        print "File not found."
        raise SystemExit

# regex = [email protected]
r = re.compile(r'(\b[\w.]+@+[\w.]+.+[\w.]\b)')
results = r.findall(bulkemails)
emails = ""
for x in results:
        emails += str(x)+"\n"

# function to write file
def writefile():
        f = open(newfilename, 'w')
        f.write(emails)
        f.close()
        print "File written."

Regex pour les numéros de téléphone:

(\d{3}[-\.\s]\d{3}[-\.\s]\d{4}|\(\d{3}\)\s*\d{3}[-\.\s]\d{4}|\d{3}[-\.\s]\d{4})

Une autre regex pour les numéros de téléphone:

(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:\(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?
15
Aaron

Si vous souhaitez apprendre Regex, vous pouvez essayer de l'écrire vous-même. Ce n'est pas aussi difficile qu'on le prétend. Des sites tels que RegexPal vous permettent de saisir des données de test, puis d’écrire et de tester une expression régulière sur ces données. À l’aide de RegexPal, essayez d’ajouter des numéros de téléphone dans les différents formats auxquels vous vous attendez (avec des crochets, des indicatifs régionaux, etc.), prenez une feuille de triche Regex et voyez jusqu’à quel point vous pouvez aller. Si rien d’autre, cela vous aidera à lire les expressions des autres peuples.

Edit: Voici une version modifiée de votre regex, qui doit également correspondre aux numéros de téléphone à 7 et 10 chiffres dépourvus de traits d'union, d'espaces ou de points. J'ai ajouté des points d'interrogation après les classes de caractères (les [] s), ce qui rend tout élément facultatif. Je l'ai testé dans RegexPal, mais comme j'apprends toujours Regex, je ne suis pas sûr que ce soit parfait. Essaie.

(\d{3}[-\.\s]??\d{3}[-\.\s]??\d{4}|\(\d{3}\)\s*\d{3}[-\.\s]??\d{4}|\d{3}[-\.\s]??\d{4})

Il correspond aux valeurs suivantes dans RegexPal:

000-000-0000
000 000 0000
000.000.0000

(000)000-0000
(000)000 0000
(000)000.0000
(000) 000-0000
(000) 000 0000
(000) 000.0000

000-0000
000 0000
000.0000

0000000
0000000000
(000)0000000
33
Auguste

Ceci est le processus de construction d'un numéro de téléphone grattant regex.

Premièrement, nous devons faire correspondre un indicatif régional (3 chiffres), une ligne réseau (3 chiffres) et une extension (4 chiffres):

reg = re.compile("\d{3}\d{3}\d{4}")

Maintenant, nous voulons capturer le numéro de téléphone correspondant, alors nous ajoutons une parenthèse autour des parties que nous souhaitons capturer (toutes celles-ci):

reg = re.compile("(\d{3}\d{3}\d{4})")

L'indicatif régional, la ligne de réseau et l'extension peuvent être séparés par 3 caractères au maximum qui ne sont pas des chiffres (comme dans le cas où des espaces sont utilisés avec le délimiteur trait d'union/point):

reg = re.compile("(\d{3}\D{0,3}\d{3}\D{0,3}\d{4})")

Maintenant, le numéro de téléphone peut en fait commencer par un caractère ( (si l'indicatif régional est entre parenthèses):

reg = re.compile("(\(?\d{3}\D{0,3}\d{3}\D{0,3}\d{4}).*?")

Maintenant, tout ce numéro de téléphone est probablement intégré à un tas d’autres textes:

reg = re.compile(".*?(\(?\d{3}\D{0,3}\d{3}\D{0,3}\d{4}).*?")

Maintenant, cet autre texte pourrait inclure des nouvelles lignes:

reg = re.compile(".*?(\(?\d{3}\D{0,3}\d{3}\D{0,3}\d{4}).*?", re.S)

Prendre plaisir!

Personnellement, je m'arrête ici, mais si vous voulez vraiment vous assurer que seuls les espaces, les traits d'union et les points sont utilisés comme délimiteurs, vous pouvez essayer les solutions suivantes (non testées):

reg = re.compile(".*?(\(?\d{3})? ?[\.-]? ?\d{3} ?[\.-]? ?\d{4}).*?", re.S)
16
dotancohen

Je pense que cette expression rationnelle est très simple pour analyser les numéros de téléphone

re.findall("[(][\d]{3}[)][ ]?[\d]{3}-[\d]{4}", lines)
6
user4959

Pour les numéros de téléphone espagnols, je l’utilise avec beaucoup de succès:

re.findall( r'[697]\d{1,2}.\d{2,3}.\d{2,3}.\d{0,2}',str)
1
Alex Moleiro

Plongez au coeur de Python a un exemple spécifique de ce que vous recherchez ici:

http://www.diveintopython.net/regular_expressions/phone_numbers.html

0
Dan McDougall

Puisque personne n'a encore posté cette regex, je le ferai. C'est ce que j'utilise pour trouver des numéros de téléphone. Il correspond à tous les formats de numéro de téléphone courants aux États-Unis. Je n'avais pas besoin de cette regex pour correspondre aux numéros internationaux, je n'ai donc pas fait d'ajustements à regex à cette fin.

phone_number_regex_pattern = r"\(?\d{3}\)?[-.\s]\d{3}[-.\s]\d{4}"

Utilisez ce modèle si vous souhaitez que les numéros de téléphone simples correspondent. Un exemple de ceci serait: "4441234567".

phone_number_regex_pattern = r"\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}"
0
Th3Tr1ckst3r