web-dev-qa-db-fra.com

Comment utiliser une variable dans une expression régulière?

Je voudrais utiliser un variable à l'intérieur d'un regex, comment puis-je faire cela dans Python?

TEXTO = sys.argv[1]

if re.search(r"\b(?=\w)TEXTO\b(?!\w)", subject, re.IGNORECASE):
    # Successful match
else:
    # Match attempt failed
186
Pedro Lobito

Vous devez construire le regex comme une chaîne:

TEXTO = sys.argv[1]
my_regex = r"\b(?=\w)" + re.escape(TEXTO) + r"\b(?!\w)"

if re.search(my_regex, subject, re.IGNORECASE):
    etc.

Notez l'utilisation de re.escape afin que, si votre texte comporte des caractères spéciaux, ils ne seront pas interprétés comme tels.

245
Ned Batchelder
if re.search(r"\b(?<=\w)%s\b(?!\w)" % TEXTO, subject, re.IGNORECASE):

Cela va insérer ce qui est dans TEXTO dans la regex sous forme de chaîne.

41
Bo Buchanan
rx = r'\b(?<=\w){0}\b(?!\w)'.format(TEXTO)
32
Cat Plus Plus

Je trouve très pratique de créer un motif d’expression régulière en enchaînant plusieurs motifs plus petits.

import re

string = "begin:id1:tag:middl:id2:tag:id3:end"
re_str1 = r'(?<=(\S{5})):'
re_str2 = r'(id\d+):(?=tag:)'
re_pattern = re.compile(re_str1 + re_str2)
match = re_pattern.findall(string)
print(match)

Sortie:

[('begin', 'id1'), ('middl', 'id2')]
5
Deepak Nagarajan

À partir de python 3.6, vous pouvez également utiliser interpolation de chaîne littérale , "chaînes f". Dans votre cas particulier, la solution serait:

if re.search(rf"\b(?=\w){TEXTO}\b(?!\w)", subject, re.IGNORECASE):
    ...do something
5
airborne

Je suis d'accord avec tout ce qui précède à moins que:

sys.argv[1] était quelque chose comme Chicken\d{2}-\d{2}An\s*important\s*anchor

sys.argv[1] = "Chicken\d{2}-\d{2}An\s*important\s*anchor"

vous ne voudriez pas utiliser re.escape, car dans ce cas, vous voudriez qu'il se comporte comme une regex

TEXTO = sys.argv[1]

if re.search(r"\b(?<=\w)" + TEXTO + "\b(?!\w)", subject, re.IGNORECASE):
    # Successful match
else:
    # Match attempt failed
3
Max Carroll

Je devais rechercher des noms d'utilisateur qui se ressemblent et ce que Ned Batchelder a dit était incroyablement utile. Cependant, j’ai constaté que j’avais une sortie plus nette lorsque j’utilisais re.compile pour créer mon terme de recherche:

pattern = re.compile(r"("+username+".*):(.*?):(.*?):(.*?):(.*)"
matches = re.findall(pattern, lines)

La sortie peut être imprimée en utilisant les éléments suivants:

print(matches[1]) # prints one whole matching line (in this case, the first line)
print(matches[1][3]) # prints the fourth character group (established with the parentheses in the regex statement) of the first line.
2
jdelaporte

vous pouvez essayer une autre utilisation en utilisant format grammer suger:

re_genre = r'{}'.format(your_variable)
regex_pattern = re.compile(re_genre)  
1
Kevin Chou

Vous pouvez également utiliser le mot clé format pour cette méthode.La méthode habituelle remplacera {} l'espace réservé à la variable que vous avez transmise à la méthode format en tant qu'argument.

if re.search(r"\b(?=\w)**{}**\b(?!\w)".**format(TEXTO)**, subject, re.IGNORECASE):
    # Successful match**strong text**
else:
    # Match attempt failed
0
Haneef Mohammed