Expression régulière pour le retour de tous les caractères entre deux caractères spéciaux
Comment pourrais-je aller sur l'aide de regx de retourner tous les caractères entre crochets.
Voici un exemple:
foobar['infoNeededHere']ddd
needs to return infoNeededHere
J'ai trouvé une regex pour faire entre les accolades, mais toutes les tentatives pour le faire fonctionner avec les crochets ont échoué. Ici, c'est que les regex: (?<={)[^}]*(?=})
et voici ma tentative de hack il
(?<=[)[^}]*(?=])
Solution Finale:
import re
str = "foobar['InfoNeeded'],"
match = re.match(r"^.*\['(.*)'\].*$",str)
print match.group(1)
OriginalL'auteur user1130161 | 2012-03-27
Vous devez vous connecter pour publier un commentaire.
^.*\['(.*)'\].*$
correspondra à une ligne de capture et de ce que vous voulez dans un groupe.Vous avez pour échapper à la
[
et]
avec\
De la documentation à l'rubular.com la preuve lien vous expliquera comment l'expression est formée.
espérons que cela aide attribuer regular-expressions.info
Puis-je utiliser cela avec le feu.de recherche?
a = re.search("^.*\['(.*)'\].*$","foobar['infoNeededHere']ddd") print a.group()
est de retourfoobar['infoNeededHere']ddd
re-lire les docs sur
search()
,match()
etgroups(num)
OriginalL'auteur
Si vous êtes nouveau à REG(gular) EX(pressions), vous apprenez à Python Docs. Ou, si vous voulez un plus doux introduction, vous pouvez consulter la HOWTO. Ils utilisent Perl-la syntaxe de style.
Regex
L'expression que vous avez besoin est
.*?\[(.*)\].*
. Le groupe que vous souhaitez sera\1
.-
.*?
:.
correspond à tout caractère, mais un retour à la ligne.*
est un méta-caractère et les moyens Répétez cette 0 fois ou plus.?
rend le*
non-gourmand, c'est à dire,.
correspondent que peu de caractères que possible avant de frapper un '['.-
\[
:\
échappe spécial méta-caractères, qui, dans ce cas, est[
. Si nous ne le faisons pas,[
ferait quelque chose de très bizarre à la place.-
(.*)
: Parenthèse "groupes" tout ce qui est à l'intérieur et vous pouvez le récupérer plus tard les groupes en fonction de leur Id numériques ou les noms (si on leur en donne un).-
\].*
: Vous devriez vous en savez assez maintenant pour savoir ce que cela signifie.Mise en œuvre
D'abord, l'importation de l'
re
module -- ce n'est pas un construit-dans-la à l'endroit où jamais vous voulez utiliser l'expression.Ensuite, utilisez
re.search(regex_pattern, string_to_be_tested)
à la recherche pour le motif dans la chaîne à tester. Cela renvoie unMatchObject
lequel vous pouvez stocker à une variable temporaire. Vous devez ensuite appeler c'estgroup()
méthode et passe 1 comme un argument (voir le "Groupe 1" nous capturées à l'aide de la parenthèse précédente). Je doit maintenant ressembler à:Une Alternative
Vous pouvez également utiliser
findall()
trouver tous les non-cumul des correspondances par la modification de l'expression régulière regex pour(?>=\[).+?(?=\])
.-
(?<=\[)
:(?<=)
est appelé un coup d'oeil derrière l'affirmation et contrôles pour une expression précédent la concordance réelle.-
.+?
:+
est juste comme*
sauf qu'elle correspond à un ou plus repititions. Il est fait de non-gourmands par?
.-
(?=\])
:(?=)
est uneà l'avance affirmation et recherche une expression suivantes le match w/o de la capture.Votre code devrait ressembler à ça:
Remarque: utilisez Toujours cru Python chaînes en ajoutant un " r " avant que la chaîne (E. g.:
r'blah blah blah'
).10x pour la lecture! J'ai écrit cette réponse quand il n'y avait pas de ceux encore, mais au moment où je l'ai fini, 2 minerai est venu et on a accepté. 🙁 x<
OriginalL'auteur Yatharth Agarwal
Si il n'y a qu'un seul de ces
[.....]
de jetons par ligne, alors vous n'avez pas besoin d'utiliser des expressions régulières à tous:Si il n'y a plus d'un par ligne, alors vous aurez besoin de modifier Jarrod regex
^.*\['(.*)'\].*$
pour correspondre à plusieurs fois par ligne, et non gourmand. (Utiliser le.*?
quantificateur au lieu de la.*
quantificateur.)OriginalL'auteur Li-aung Yip