Expressions régulières pour les processus et les threads Python

Notes d'étude Python, enregistrements spéciaux, partagez avec vous, j'espère que cela sera utile à tout le monde.

Expression régulière

Les chaînes sont la structure de données la plus fréquemment impliquée dans la programmation, et le besoin de manipuler des chaînes est presque partout. Par exemple, pour déterminer si une chaîne de caractères est une adresse e-mail légale, bien qu'il soit possible d'extraire par programme la sous-chaîne avant et après @, puis de déterminer s'il s'agit d'un mot et d'un nom de domaine, ce n'est pas seulement gênant, mais aussi difficile de réutiliser le code.

Les expressions régulières sont une arme puissante pour faire correspondre les chaînes. Son idée de conception est d'utiliser un langage descriptif pour définir une règle pour une chaîne. Toute chaîne conforme à la règle est considérée comme "mise en correspondance". Sinon, la chaîne est illégale.

Ainsi, la façon dont nous jugeons si une chaîne est un e-mail valide est:

  1. Créez une expression régulière qui correspond à Email;

  2. Utilisez l'expression régulière pour faire correspondre l'entrée de l'utilisateur pour déterminer si elle est légale.

Étant donné que les expressions régulières sont également représentées par des chaînes, nous devons d'abord comprendre comment utiliser des caractères pour décrire des caractères.

Dans l'expression régulière, si le caractère est donné directement, il s'agit d'une correspondance exacte. Utilisez \ d pour faire correspondre un nombre et \ w pour faire correspondre une lettre ou un nombre, donc:

  • '00 \ d 'peut correspondre à' 007 ', mais ne peut pas correspondre à' 00A ';
  • '\ d \ d \ d' peut correspondre à '010';
  • «\ w \ w \ d» peut correspondre à «py3»;

. Peut correspondre à n'importe quel caractère, donc:

  • «py.» peut correspondre à «pyc», «pyo», «py!» et ainsi de suite.

Pour faire correspondre les caractères de longueur variable, dans l'expression régulière, utilisez * pour représenter n'importe quel nombre de caractères (y compris 0), utilisez + pour représenter au moins un caractère, utilisez? Pour représenter 0 ou 1 caractère et utilisez {n} pour représenter n caractères, utilisez {n, m} pour représenter nm caractères:
Prenons un exemple complexe: \ d {3} \ s + \ d {3,8}.
Lisons-le de gauche à droite:

  1. \ d {3} signifie correspondre à 3 nombres, tels que «010»;
  2. \ s peut correspondre à un espace (comprend également des espaces blancs tels que Tab), donc \ s + signifie qu'il y a au moins un espace, par exemple, correspond à «», «», etc.
  3. \ d {3,8} signifie 3-8 nombres, tels que "1234567".

Prises ensemble, les expressions régulières ci-dessus peuvent faire correspondre des numéros de téléphone avec des indicatifs régionaux séparés par un nombre quelconque d'espaces.

Que faire si vous voulez faire correspondre un nombre tel que «010-12345»? Puisque «-» est un caractère spécial, dans les expressions régulières, il est nécessaire d'utiliser «» pour échapper, donc le régulier ci-dessus est \ d {3} - \ d {3,8}.

Cependant, il ne peut toujours pas correspondre à «010-12345» en raison d'espaces. Nous avons donc besoin de méthodes de correspondance plus compliquées.

Avancée

Pour une correspondance plus précise, vous pouvez utiliser [] pour indiquer la plage, par exemple:

  • [0-9a-zA-Z_] peut correspondre à un nombre, une lettre ou un trait de soulignement;
  • [0-9a-zA-Z _] + peut correspondre à une chaîne composée d'au moins un chiffre, une lettre ou un trait de soulignement, comme "a100", "0_Z", "Py3000", etc.
  • [a-zA-Z _] [0-9a-zA-Z _] * peut correspondre en commençant par une lettre ou un trait de soulignement, suivi de toute chaîne composée d'un nombre, d'une lettre ou d'un trait de soulignement, qui est une variable Python légale;
  • [a-zA-Z _] [0-9a-zA-Z _] {0, 19} limite plus précisément la longueur de la variable à 1 à 20 caractères (1 caractère à l'avant + jusqu'à 19 caractères à l'arrière).

A | B peut correspondre à A ou B, donc (P | p) ython peut correspondre à "Python" ou "python".
Indique le début de la ligne, \ d indique qu'elle doit commencer par un nombre.
Erreur d'analyse KaTeX: Séquence de contrôle non définie: \ d à la position 8: indique la fin de la ligne, \ ̲d̲ indique qu'elle doit se terminer par un nombre.
Vous avez peut-être remarqué que py peut également correspondre à «python», mais l'ajout de ^ py $ devient une correspondance de ligne entière, qui ne peut correspondre qu'à «py».

module re

Avec les connaissances de préparation, nous pouvons utiliser des expressions régulières en Python. Python fournit le module re, qui contient toutes les fonctions d'expression régulière. Étant donné que les chaînes Python elles-mêmes sont également échappées avec \, veuillez porter une attention particulière à:

s = 'ABC\\-001' # Python的字符串
# 对应的正则表达式字符串变成:
# 'ABC\-001'

Par conséquent, nous vous recommandons fortement d'utiliser le préfixe r de Python, vous n'avez donc pas à vous soucier de l'échappement:

s = r'ABC\-001' # Python的字符串
# 对应的正则表达式字符串不变:
# 'ABC\-001'

Regardez d'abord comment déterminer si l'expression régulière correspond:

import re
re.match(r'^\d{3}\-\d{3,8}$', '010-12345')
 re.match(r'^\d{3}\-\d{3,8}$', '010 12345')

La méthode match () évalue s'il existe une correspondance. Si la correspondance réussit, elle renvoie un objet Match, sinon elle renvoie None. La méthode de jugement courante est:

test = '用户输入的字符串'
if re.match(r'正则表达式', test):
    print('ok')
else:
    print('failed')

Chaîne divisée

Le fractionnement d'une chaîne avec des expressions régulières est plus flexible que l'utilisation de caractères fixes. Veuillez consulter le code de fractionnement normal:

'a b   c'.split(' ')
['a', 'b', '', '', 'c']

Eh bien, les espaces continus ne peuvent pas être reconnus, essayez d'utiliser des expressions régulières:

re.split(r'\s+', 'a b   c')
['a', 'b', 'c']

Peu importe le nombre d'espaces, il peut être divisé normalement. Rejoignez, essayez:

re.split(r'[\s\,]+', 'a,b, c  d')
['a', 'b', 'c', 'd']

Rejoignez-nous; essayez:

re.split(r'[\s\,\;]+', 'a,b;; c  d')
['a', 'b', 'c', 'd']

Si l'utilisateur entre un ensemble de balises, n'oubliez pas d'utiliser des expressions régulières pour convertir l'entrée irrégulière dans le tableau correct la prochaine fois.

Regroupement

En plus de simplement juger si cela correspond, les expressions régulières ont également la fonction puissante d'extraire des sous-chaînes. Utilisez () pour indiquer le groupe à extraire. tel que:

^ (\ d {3}) - (\ d {3,8}) $ définit respectivement deux groupes, qui peuvent directement extraire l'indicatif régional et le numéro local de la chaîne correspondante:

import re

m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
print m
print m.group(0)
print m.group(1)
print m.group(2)

résultat de l'opération:

<_sre.SRE_Match object at 0x100249360>
010-12345
010
12345

Process finished with exit code 0

Si un groupe est défini dans l'expression régulière, la sous-chaîne peut être extraite à l'aide de la méthode group () sur l'objet Match.

Notez que group (0) est toujours la chaîne d'origine, group (1), group (2) ... représentent les sous-chaînes 1, 2, ...

L'extraction de sous-chaînes est très utile. Regardons un exemple plus brutal:

t = '19:05:30'
m = re.match(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$', t)
print m.groups()

résultat de l'opération:

('19', '05', '30')

Process finished with exit code 0

Cette expression régulière permet d'identifier directement l'heure légale. Cependant, dans certains cas, les expressions régulières ne peuvent pas être utilisées pour terminer la vérification, comme l'identification de la date:

'^(0[1-9]|1[0-2]|[0-9])-(0[1-9]|1[0-9]|2[0-9]|3[0-1]|[0-9])$'

En ce qui concerne les dates illégales telles que «2-30» et «4-31», elles ne sont toujours pas reconnues par les règles habituelles, ou il est très difficile de les écrire. À ce stade, le programme doit coopérer avec la reconnaissance.

Match gourmand

Enfin, il est important de souligner que la correspondance régulière est une correspondance gourmande par défaut, c'est-à-dire qu'elle correspond au plus de caractères possible. Un exemple est le suivant, faisant correspondre le 0 après le nombre:

print re.match(r'^(\d+)(0*)$', '102300').groups()

résultat de l'opération:

('102300', '')

Process finished with exit code 0

Puisque \ d + adopte une correspondance gourmande, il correspond directement à tous les 0 suivants. Par conséquent, 0 * ne peut correspondre qu'à la chaîne vide.

Vous devez faire en sorte que \ d + utilise une correspondance non gourmande (c'est-à-dire correspondre le moins possible) pour correspondre aux 0 suivants, et ajouter un? Pour que \ d + utilise une correspondance non gourmande:

print re.match(r'^(\d+?)(0*)$', '102300').groups()

résultat de l'opération:

('1023', '00')

Process finished with exit code 0

Compiler

Lorsque nous utilisons des expressions régulières en Python, le module re fera deux choses à l'intérieur:

  1. Compilez l'expression régulière, si la chaîne de l'expression régulière elle-même est illégale, une erreur sera signalée;
  2. Utilisez l'expression régulière compilée pour correspondre à la chaîne.

Si une expression régulière doit être réutilisée des milliers de fois, pour des raisons d'efficacité, nous pouvons précompiler l'expression régulière. Lorsqu'elle est réutilisée, il n'est pas nécessaire de compiler cette étape et de correspondre directement:

import re

re_telephone = re.compile(r'^(\d{3})-(\d{3,8})$')
print re_telephone.match('010-12345').groups()
print re_telephone.match('010-8086').groups()

résultat de l'opération:

('010', '12345')
('010', '8086')

Process finished with exit code 0

Après la compilation, un objet Expression régulière est généré. Étant donné que l'objet lui-même contient des expressions régulières, il n'est pas nécessaire de donner une chaîne régulière lors de l'appel de la méthode correspondante.

Bienvenue à faire attention au compte public "Développement Web" , vous pouvez recevoir une démonstration de test python et des ressources d'apprentissage, tout le monde apprend python ensemble et collecter les méthodes du monde, ce qui est pratique pour vous et moi à développer .

J'espère pouvoir vous aider. Si vous avez des questions, vous pouvez rejoindre le groupe d'échange technique QQ: 668562416
S'il y a quelque chose de mal ou d'insuffisant, j'espère également que les lecteurs pourront fournir plus de commentaires ou de suggestions.
Si vous avez besoin de réimprimer, s'il vous plaît contactez-moi. Vous pouvez réimprimer avec autorisation, merci


Bienvenue à prêter attention au compte public "Développement Web"

image

Je suppose que tu aimes

Origine blog.csdn.net/qq_36478920/article/details/102929044
conseillé
Classement