Essayer de trouver une expression régulière pour rechercher une correspondance de mot-clé à la fin de la ligne et au début de la ligne suivante (le cas échéant)
J'ai essayé ci-dessous l'expression régulière et ne semble pas renvoyer le résultat souhaité
sentence = """ This is my keyword /n value"""
Mon entrée par exemple est
re.compile(fr"\s(?!^)(keyword1|keyword2|keyword3)\s*\$\n\r\((\w+\W+|W+\w+))", re.MULTILINE | re.IGNORECASE)
La sortie dans le cas ci-dessus doit être la valeur du mot clé
Merci d'avance p >
3 Réponses :
Que diriez-vous de \ b (mot-clé) \ n (\ w +) \ b ?
\b(keyword)\n(\w+)\b
\b get a word boundary
(keyword) capture keyword (replace with whatever you want)
\n match a newline
(\w+) capture some word characters, one or more
\b get a word boundary
Étant donné que keyword et \ w + sont dans des groupes de capture, vous pouvez les référencer comme vous le souhaitez plus tard dans votre code. p >
Je suppose que, selon le nombre de nouvelles lignes que vous pourriez avoir, une expression similaire à:
\b(?:keyword1|keyword2|keyword3)\b[r\n]{1,2}(\S+)
pourrait être un peu proche et la valeur est dans \ 2 , vous pouvez rendre le premier groupe non capturé, puis:
\b(keyword1|keyword2|keyword3)\b[r\n]{1,2}(\S+)
\ 1 est le valeur.
Si vous souhaitez explorer / simplifier / modifier l'expression, c'est expliqué dans le panneau supérieur droit de regex101.com . Si tu veux, tu peut également regarder en ce lien , comment il correspondrait contre quelques exemples d'entrées.
Vous pouvez faire correspondre le mot clé (ou utiliser une alternative ) pour faire correspondre plus de mots clés et tenez compte des tabulations et des espaces de fin après le mot-clé et après avoir fait correspondre une nouvelle ligne.
En utilisant 2 groupes de capture comme dans le modèle que vous avez essayé:
import re
regex = r"(?<!\S)(keyword)[\t ]*\r?\n[\t ]*(\w+)(?!\S)"
test_str = (" This is my keyword\n"
" value")
matches = re.search(regex, test_str)
if matches:
print('{} {}'.format(matches.group(1), matches.group(2)))
Explication
(? Regard négatif en arrière, affirmer que ce qui est directement à gauche n'est pas un caractère non blanc (mot-clé) Capture dans le groupe 1 correspondant au mot-clé [\ t] * Correspond à 0 onglets ou espaces ou plus \ r? \ n Match newline [\ t] * Correspond à 0 onglets ou espaces ou plus (\ w +) Capturer le groupe 2 correspond à plus de 1 caractères de mot (?! \ S) Lookahead négatif, affirmer que ce qui est directement à droite n'est pas un caractère sans espace Par exemple:
(?<!\S)(keyword)[\t ]*\r?\n[\t ]*(\w+)(?!\S)
Sortie
valeur du mot clé
Votre expression régulière semble essayer de faire correspondre mot-clé1, mot-clé2 ou mot-clé3 et la ligne suivante commence par / n, alors comment finissez-vous par dire que le résultat doit être «valeur du mot-clé». Je pense que vous devez redéfinir précisément ce qu'est une `` correspondance de mot-clé '' et ce que vous recherchez au début de la ligne suivante (et dites-vous que la ligne suivante est facultative, ce qui signifie que le mot-clé peut être à la fin de la chaîne et c'est toujours un bon match?).
Qu'en est-il de ce
(mot-clé \ d *) \ s * $ \ s * (\ w +. *)? regex101.com/r/frwd9Q/2 .