133 votes

Expression régulière pour correspondre à un point

Je me demandais quelle était la meilleure façon de faire correspondre "test.this" de "blah blah blah test.this@gmail.com blah blah" est ? Utilisation de Python.

J'ai essayé re.split(r"\b\w.\w@")

217voto

Yuushi Points 10656

A . en regex est un méta-caractère, il est utilisé pour faire correspondre n'importe quel caractère. Pour faire correspondre un point littéral dans une chaîne Python brute ( r"" o r'' ), vous devez l'échapper, donc r"\."

54voto

Rohit Jain Points 90368

Dans votre regex, vous devez s'échapper le point "\." ou l'utiliser à l'intérieur d'un classe de caractères "[.]" car il s'agit d'un méta-caractère dans les regex, qui correspond à n'importe quel caractère.

Aussi, vous avez besoin \w+ au lieu de \w pour faire correspondre un ou plusieurs caractères de mot.


Maintenant, si vous voulez le test.this le contenu, alors split n'est pas ce dont vous avez besoin. split divisera votre chaîne autour du test.this . Par exemple :

>>> re.split(r"\b\w+\.\w+@", s)
['blah blah blah ', 'gmail.com blah blah']

Vous pouvez utiliser re.findall :

>>> re.findall(r'\w+[.]\w+(?=@)', s)   # look ahead
['test.this']
>>> re.findall(r'(\w+[.]\w+)@', s)     # capture group
['test.this']

14voto

StackUser Points 403

"Dans le mode par défaut, le point (.) correspond à n'importe quel caractère sauf une nouvelle ligne. Si l'indicateur DOTALL a été spécifié, il correspond à n'importe quel caractère, y compris une nouvelle ligne." (Doc. python)

Donc, si vous voulez évaluer la littéralité du point, je pense que vous devriez le mettre entre crochets :

>>> p = re.compile(r'\b(\w+[.]\w+)')
>>> resp = p.search("blah blah blah test.this@gmail.com blah blah")
>>> resp.group()
'test.this'

1voto

Ali Abul Hawa Points 136

Pour échapper aux caractères non alphanumériques des variables de chaîne, y compris les points, vous pouvez utiliser re.escape :

import re

expression = 'whatever.v1.dfc'
escaped_expression = re.escape(expression)
print(escaped_expression)

sortie :

whatever\.v1\.dfc

vous pouvez utiliser l'expression échappée pour rechercher/apparier la chaîne littéralement.

0voto

Gabriel Staples Points 1804

Voici mon complément à la réponse principale de @Yuushi :

Gardez à l'esprit que la barre oblique inverse ( \ ) Le caractère lui-même doit être échappé en Python s'il est utilisé à l'intérieur d'une chaîne régulière ( 'some string' o "some string" ) au lieu d'un brut chaîne de caractères ( r'some string' o r"some string" ). Il faut donc garder à l'esprit le type de chaîne que vous utilisez. Pour échapper au point ou au point ( . ) à l'intérieur d'une expression régulière dans une chaîne python régulière, vous devez donc également échapper la barre oblique inverse en utilisant une double barre oblique inverse ( \\ ), ce qui fait que la séquence d'échappement totale pour le . dans l'expression régulière ceci : \\. comme le montrent les exemples ci-dessous.

Par conséquent, ils ne sont PAS autorisés. Ils provoqueront un avertissement du type suivant :

DeprecationWarning : séquence d'échappement invalide \.

'\.'   # NOT a valid escape sequence in Python
"\."   # NOT a valid escape sequence in Python

Et tous ces éléments sont autorisés et sont équivalents :

# Use a DOUBLE BACK-SLASH in Python _regular_ strings
'\\.'  # Python regular string
"\\."  # Python regular string

# Use a SINGLE BACK-SLASH in Python _raw_ strings 
r'\.'  # Python raw string
r"\."  # Python raw string

Références :

  1. RÉFÉRENCE PRINCIPALE ET OFFICIELLE : https://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals enter image description here
  2. [réponse de @Sean Hammond] Comment corriger "<string> DeprecationWarning : invalid escape sequence" en Python ?

    Si vous voulez mettre un \ dans une chaîne de caractères, vous devez utiliser \\

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X