Disons que j'ai une chaîne 'gfgfdAAA1234ZZZuijjk'
et que je veux extraire uniquement la '1234'
partie.
Je sais seulement quels seront les quelques personnages directement avant AAA
et après ZZZ
la partie qui m'intéresse 1234
.
Avec, sed
il est possible de faire quelque chose comme ça avec une chaîne:
echo "$STRING" | sed -e "s|.*AAA\(.*\)ZZZ.*|\1|"
Et cela me donnera 1234
comme résultat.
Comment faire la même chose en Python?
Ensuite, vous pouvez également utiliser des expressions rationnelles avec le module re, si vous le souhaitez, mais ce n'est pas nécessaire dans votre cas.
la source
re
méthode n'est-elle pas plus rapide?s
,s.find
il reviendra-1
. l'opérateur de découpages[begin:end]
l'acceptera comme index valide et renverra la sous-chaîne indésirable.expression régulière
La situation ci-dessus échouera avec un
AttributeError
s'il n'y a pas de "AAA" et "ZZZ" dansyour_text
méthodes de chaîne
Ce qui précède retournera une chaîne vide si "AAA" ou "ZZZ" n'existent pas
your_text
.Défi PS Python?
la source
la source
AttributeError: 'NoneType' object has no attribute 'groups'
- s'il n'y a pas d'AAA, ZZZ dans la chaîne ...Surpris que personne n'ait mentionné cela, qui est ma version rapide pour les scripts uniques:
la source
vous pouvez utiliser une seule ligne de code
le résultat recevra la liste ...
la source
Vous pouvez utiliser le module re pour cela:
la source
echo "$STRING" | sed -e "s|.*AAA\(.*\)ZZZ.*|\1|"
Vous pouvez faire de même avec une
re.sub
fonction utilisant la même expression régulière.Dans sed de base, le groupe de capture est représenté par
\(..\)
, mais en python, il était représenté par(..)
.la source
En python, l'extraction de la chaîne de formulaire de sous-chaîne peut être effectuée à l'aide de la
findall
méthode dure
module d' expression régulière ( ).la source
la source
la source
Donne
la source
Juste au cas où quelqu'un devra faire la même chose que moi. J'ai dû tout extraire entre parenthèses en ligne. Par exemple, si j'ai une phrase comme «le président américain (Barack Obama) a rencontré ...» et que je veux obtenir uniquement «Barack Obama», c'est la solution:
C'est-à-dire que vous devez bloquer les parenthèses avec
slash \
signe. Bien qu'il s'agisse d'un problème d'expressions plus régulières que Python.De plus, dans certains cas, vous pouvez voir des symboles «r» avant la définition de l'expression régulière. S'il n'y a pas de préfixe r, vous devez utiliser des caractères d'échappement comme en C. Voici plus de discussion à ce sujet.
la source
Utilisation de PyParsing
ce qui donne:
[['1234']]
la source
Voici une solution sans regex qui tient également compte des scénarios où la première sous-chaîne contient la deuxième sous-chaîne. Cette fonction ne trouvera une sous-chaîne que si le deuxième marqueur est après le premier marqueur.
la source
Une autre façon de le faire est d'utiliser des listes (en supposant que la sous-chaîne que vous recherchez est composée uniquement de nombres):
la source
Un liners qui renvoie une autre chaîne s'il n'y a pas de correspondance. Edit: la version améliorée utilise la
next
fonction, remplacez"not-found"
par quelque chose d'autre si nécessaire:Mon autre méthode pour le faire, moins optimale, utilise la 2e expression régulière, n'a toujours pas trouvé de moyen plus court:
la source