9
votes

Regex pour triple citation

Ce que REGEX trouvera les commentaires triple citation (éventuellement multi-lignes) dans un code source Python?


0 commentaires

5 Réponses :


5
votes
re.findall('(?:\n[\t ]*)\"{3}(.*?)\"{3}', s, re.M | re.S)
captures only text within triple quotes that are at the begging of a line and could be preceded by spaces, tabs or nothing, as python docstrings should be.

6 commentaires

et qu'en est-il de cela: a = '"" "" Pas une vraie triple citation "" "'


Pourquoi n'est-ce pas une vraie trotteuse citation? Y a-t-il quelque chose de perdu dans le formatage?


Je suppose que la réégalité assez similaire pourrait être utilisée pour obtenir des guillemets simples (il est assez facile de prolonger l'exemple de l'extension), je ne vois juste pas de point à faire de la farce Single Regex au point de non-textilité.


Parce que c'est dans une citation simple ... Donc, cela fait partie d'un littéral à chaîne.


Est-ce une corde brute, Bobince?


Travaillé pour moi, quand beaucoup d'autres choses ont échoué sur des doctorats complexes avec plusieurs citations à l'intérieur. Bon travail. Si vous voulez un moyen simple rapide de supprimer Doctstrings de Python Source, utilisez simplement ceci. +1



11
votes

python n'est pas une langue régulière et ne peut pas être analysé de manière fiable à l'aide de regex.

Si vous voulez un analyseur Python approprié, regardez le AST Module. Vous recherchez peut-être get_docstring .


5 commentaires

+1: La question n'a pas de solution valide à l'aide de Regexes, seulement des hacks à moitié ouvrière.


Je crois que les expressions régulières sont suffisamment puissantes pour faire ce droit. Mais construire une réégalité appropriée pour une telle tâche est difficile, l'utilisation d'un analyseur Python intégré est une solution plus fiable.


Avez-vous un lien pour ça? 'Ne peut pas être analysé de manière fiable avec regex'. Quelles langues peuvent?


Résumé de la théorie à peine lisible: en.wikipedia.org/wiki/regular_language . La plupart des langages de programmation ne sont pas, mais la regex moderne présente des extensions qui bien absorbées au-delà de la correspondance traditionnelle de la langue régulière. La syntaxe de Python, cependant, est toujours trop complexe pour être agréable pour regex.


Voir aussi Stackoverflow.com/questions/612654/...



0
votes

J'ai trouvé celui-ci de Tim Peters (je pense):

pat = """
    qqq
    [^\\q]*
    (
    (   \\\\[\000-\377]
        |   q
        (   \\\\[\000-\377]
        |   [^\\q]
        |   q
        (   \\\\[\000-\377]
            |   [^\\q]
        )
        )
    )
    [^\\q]*
    )*
    qqq
"""  
pat = ''.join(pat.split(), '')  
tripleQuotePat = pat.replace("q", "'") + "|" + pat.replace('q', '"')  


0 commentaires

3
votes

Je trouve que cela fonctionne parfaitement pour moi (utilisé avec Textmate):

#.*$


1 commentaires

Notez que la faible répétition ( *? ) est fiable pour la correspondance juste une chaîne de triqle-cité, mais gagne risquée si vous construisez un modèle plus important de celui-ci. Par exemple. \ ("" "[\ s \ s] *" "" "" \) ne signifie pas une chaîne triple citée entre parenthèses - il correspondra également à ("" 1ère chaîne "" "Peu importe ..." "" 2nd chaîne "") .



0
votes

Je ne sais pas à quel point cela va bien lors de la numérisation du code Python, mais cela semble correspondre à des chaînes Python isolément.

^(\"([^\"\n\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*\"|'([^'\n\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*'|\"\"\"((?!\"\"\")[^\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*\"\"\")$


0 commentaires