Essayer sans chance dans Notepad ++ de remplacer tous les caractères non-mots \ W par un trait de soulignement _ à partir d'un bloc de texte sur plusieurs lignes, à l'exception (et à droite de) deux points: (ce qui ne se produit pas sur chaque ligne - quelque chose d'espace - hiérarchie délimitée, se terminant par une paire clé-valeur). Une solution python pourrait également être utile, car j'essaie de faire d'autres choses avec elle une fois reformatée. Exemple:

This 100% isn't what I want   
  Yet, it's-what-I've got currently: D@rnit :(  
This_100_is_what_I_d_like: See?  
  Indentation_isn_t_necessary  
    _to_maintain_but_would_be_nice: :)<-preserved!
  I_m_Mr_Conformist_over_here: |Whereas, I'm like whatever's clever.| 
If_you_can_help: Thanks 100.1%!
-1
bladeo 13 avril 2018 à 06:53

3 réponses

Meilleure réponse

J'avoue que je réponds à une question hors sujet que j'ai juste aimé le problème. Maintenez CTRL + H , activez les expressions régulières dans N ++ puis recherchez:

(:[^\r\n]*|^\s+)|\W(?<![\r\n])

Et remplacez par:

(?1\1:_)

Regex a deux parties principales. Premier côté de l'alternance externe qui correspond aux premiers espaces d'une ligne (indentation) ou à tout ce qui suit la première occurrence d'un signe deux-points, et deuxième côté qui correspond à un caractère autre qu'un mot, sauf un retour chariot \r ou un retour à la ligne {{X1} } caractère (en négatif derrière) pour conserver les sauts de ligne. La chaîne de remplacement est un bloc conditionnel qui indique que si le premier groupe de capture correspond, remplacez-le par lui-même et sinon, remplacez-le par un _.

0
revo 13 avril 2018 à 07:12

Vous pouvez essayer ce script python,

ss="""This 100% isn't what I want   
  Yet, it's-what-I've got currently: D@rnit :(  
If you can help: Thanks 100.1%!"""

import re
splitcapture=re.compile(r'(?m)^([^:\n]+)(:[^\n]*|)$')
subregx=re.compile(r'\W+')
print(splitcapture.sub(lambda m: subregx.sub('_', m.group(1))+m.group(2), ss))

Dans lequel j'ai d'abord essayé de faire correspondre chaque ligne et de capturer 2 parties séparément (le one part ne contenant pas le caractère ':' est capturé en group 1, et l'autre partie possible a commencé par '{{ X3}} 'et continue jusqu'à la fin de la ligne est capturé dans group 2), puis implémenté le processus de remplacement uniquement sur la chaîne capturée du groupe 1 et finalement joint 2 parties, replaced group 1 + {{X6} }

Et la sortie est

This_100_isn_t_what_I_want_
_Yet_it_s_what_I_ve_got_currently: D@rnit :(  
If_you_can_help: Thanks 100.1%!
0
Thm Lee 13 avril 2018 à 13:29

En voyant une meilleure description de ce que vous essayez de faire, je ne pense pas que vous pourrez le faire depuis le bloc-notes ++ en utilisant une seule expression régulière. Cependant, vous pouvez écrire un script python qui fait défiler votre document, une ligne à la fois, et désinfecte tout ce qui se trouve à gauche des deux points (s'il en existe un)

Voici un exemple rapide et sale (non testé). Cela suppose que doc est un pointeur de fichier ouvert vers le fichier que vous souhaitez nettoyer

import re

sanitized_lines = []
for line in doc:
    line_match = re.match(r"^(\s*)([^:\n]*)(.*)", line)
    indentation = line_match.group(1)
    left_of_colon = line_match.group(2)
    remainder = line_match.group(3)

    left_of_colon = re.sub(r"\W", "_", left_of_colon)

    sanitized_lines.append("".join((indentation, left_of_colon, remainder)))

sanitized_doc = "".join(sanitized_lines)
print(sanitized_doc)
0
acattle 13 avril 2018 à 07:00