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
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.
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.
rx = r'\b(?<=\w){0}\b(?!\w)'.format(TEXTO)
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')]
À 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
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
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.
vous pouvez essayer une autre utilisation en utilisant format
grammer suger:
re_genre = r'{}'.format(your_variable)
regex_pattern = re.compile(re_genre)
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