Essentiellement, je veux supprimer le texte entre un crochet de fermeture "]" et le début d'un mot (APPEL ou RETOUR)

Cordes avec lesquelles travailler:

[2018-01-18 18:22:28,516] .- CALL do.something(key=True)

[2018-01-18 18:22:28,517] .- RETURN do.something

Production attendue:

.- .-

Mon code ressemble à ceci:

def find_middle_bit(string):
    string_of_interest = re.search(r"\](.*)[^A-Za-z]", string)
    print str(string.strip())
    if string_of_interest:
        print string_of_interest.group(1)


line = "[2018-01-18 18:22:28,516] .- CALL do.something(key=True)"
find_middle_bit(line)

Sortie réelle:

.- CALL do.something(key=True

Qu'est-ce que j'oublie ici?

0
QCFia 11 avril 2018 à 18:11

3 réponses

Meilleure réponse

Une option serait d'utiliser des contournements pour cibler le texte que vous souhaitez capturer:

string = "[2018-01-18 18:22:28,516] .- CALL do.something(key=True)"
string_of_interest = re.search(r"(?<=\]\s)(.*?)(?=\s(?:CALL|RETURN))", string)
print str(string.strip())
if string_of_interest:
    print string_of_interest.group(1)

.-          <-- (this is what gets printed)

Démo

1
Tim Biegeleisen 11 avril 2018 à 15:24

J'ai tendance à trouver l'utilisation de l'appariement de groupes très utile pour ce genre de travail. Nécessite moins de puissance cérébrale. Considérer:

from functools import partial
import re

lines = ['[2018-01-18 18:22:28,516] .- CALL do.something(key=True)', 
         '[2018-01-18 18:22:28,517] .- RETURN do.something']
extract = partial(re.sub, '\[.*?\]\s*(.*?)\s.*', '\g<1>')
for line in lines:
   print(extract(line))

Production

.-
.-
0
snakes_on_a_keyboard 11 avril 2018 à 15:57

Utilisez plutôt:

\]([^A-Z]*)

Démo en ligne

Votre expression régulière \](.*)[^A-Za-z] correspond d'abord à une parenthèse fermante ] (c'est OK), puis à un certain nombre d'anychar suivi d'un caractère qui n'est pas une lettre. Parce que .* est gourmand, il faut autant de caractères que possible. Dans votre cas, il atteint la fin de la chaîne, puis revient en arrière une fois pour faire correspondre ) avec [^A-Za-z]

0
mrzasa 11 avril 2018 à 15:14