1
votes

Regex Recherche fin de ligne et début de ligne suivante

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 >


2 commentaires

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 .


3 Réponses :


0
votes

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 >

Essayez-le ici!


0 commentaires

0
votes

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.



0 commentaires

1
votes

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

Démo Regex | Démo Python

Par exemple:

(?<!\S)(keyword)[\t ]*\r?\n[\t ]*(\w+)(?!\S)

Sortie

valeur du mot clé


0 commentaires