0
votes

Comment obtenir la sortie de la valeur d'occurrences uniques avec le filtre de regex dans le format HH: mm dans une liste?

J'ai une liste dans HH: mm: ss comme ceci: xxx

Je veux obtenir la sortie de retour dans HH: mm avec compter de la liste A. Comme ceci: xxx

et s'il vous plaît notez que la liste d'une valeur peut avoir une variation de HH: mm: ss à une heure différente, pas seulement le 08:54 et 08 : 55, Parce que je dois filtrer à partir d'un fichier journal, le HH: MM: SS de la liste A n'a pas d'occurrence fixe HH: mm.

J'ai construit une regex pour correspondre à la HH: MM: SS (n'importe quel SS) mais je ne sais pas comment appliquer pour filtrer la liste. xxx

merci de lire


5 commentaires

Les expressions sont-elles obligatoires ici? Il existe d'autres moyens, sans utiliser des regex, qui pourraient être moins compliqués.


@TrebledJ Je pense que Regex n'utilise pas la cause obligatoire que je ne viens pas de ne pas nuire aux autres moyens. Pouvez-vous fournir votre solution? Merci!


Le point que vous souhaitez supprimer NON-HH: mm: valeurs SS de la liste? Si oui, pouvez-vous poster une liste d'entrée d'exemple plus réaliste?


@LuatDangletRong ah bien. J'ai écrit une réponse. Jamais entendu parler de cette blague: " Certaines personnes, quand elles sont confrontées à un problème, pensez-moi" que je sais, je vais utiliser des expressions régulières. "Maintenant, ils ont deux problèmes. " :)


@Trevedj merci haha, oui, je n'ai jamais entendu parler de cela, je viens d'entrer dans un stage en python et totalement frais: D, je me souviendra certainement de cela: D.


3 Réponses :


2
votes

Puisque vous filtrez un fichier journal, je suppose que les horodatages sont chronologiques. Ensuite, vous pouvez utiliser ithertools.groupby code> pour grouper des éléments avec des touches de minutes d'heure similaires.

08:54 occurred 4 times
08:55 occurred 6 times


1 commentaires

Je n'ai pas vu cela quand j'ai posté ma réponse, mais je dirais que c'est une solution supérieure car elle n'utilise pas Regex.



0
votes

Je ne sais pas si votre modèle de regex fonctionne, mais si tel est le cas, vous pouvez faire quelque chose comme ça pour appliquer le motif à chaque élément de la liste: xxx pré>

mapper code> appliquera motif.search code> à chaque élément du A code> et filtre code> filtrera ce résultat que seuls les éléments correspondant à la regex modèle sont inclus. À ce stade, vous avez un irable contenant des objets de match Regex. Ensuite, une compréhension de liste est utilisée pour créer une liste dans laquelle chacun des éléments de la liste est le résultat de la m.group (1) code> expression. Vous devrez peut-être modifier votre modèle de regex pour vous assurer que le seul groupe de capture utilisé consiste à capturer les informations souhaitées, ou vous devrez peut-être modifier légèrement mon code (c.-à-d. Ne pas appeler M.Group (1), extraire. informations des objets correspondants d'une manière différente). Ensuite, compteur (correspondance) code> comptera les occurrences pour vous. P>

Je ne suis pas vraiment suivi de votre modèle de regex, voici un exemple de jouet qui montre comment ma solution est destinée à Travail: P>

import re
from collections import Counter

pattern = re.compile("hello (.+)")
l = ["hello world","hello people","hello guys", "nothing here matches", "hello guys"]
matches = [m.group(1) for m in filter(None, map(pattern.search,l))]
print(Counter(matches))


2 commentaires

Compteur semble être la bonne façon de partir, mais votre premier extrait est l'impression compteur ({'08': 10}) . Je pense que la partie mm de la regex a également besoin d'un groupe de capture également.


Ouais, je n'ai pas pris la peine de tester ni de modifier le modèle de regex, j'imagine que c'est comme ça que ça devrait être fait si



1
votes

Comme les autres personnes ont mentionné, il existe de meilleurs moyens d'obtenir la sortie que vous désirez, mais si vous voulez toujours savoir comment appliquer la regex sur une liste, voici une solution:

import re
a = ['08:54:53', '08:54:53', '08:54:54', '08:54:54', '08:55:20', '08:55:20', '08:55:20', '08:55:22', '08:55:23', '08:55:23']
pattern = re.compile("(\d{2}:\d{2}):\d{2}")
hh_mm = map(lambda time: re.search(pattern, time).group(1), a) # Python 2
hh_mm = list(map(lambda time: re.search(pattern, time)[1], a)) # Python 3 

# print output
[print('{} occurs {} times.'.format(time, hh_mm.count(time))) for time in set(hh_mm)]


0 commentaires