0
votes

Regex pour obtenir les mots clés, tous les chiffres et points

Mon texte d'entrée ressemble à ceci:

Mettez en place 3 rallonges, mais au 4e étage, le signal est faible, elles ne se chevauchent pas. ST -99. 5G DL 624,26 jusqu'à 168,20 4g DL 2 Jusqu'à .44

J'ai des difficultés à écrire une expression régulière qui correspondra à toutes les instances de 4G / 5G / 4g / 5g et me donnera toutes les mesures correspondantes après les instances de ces codes, qui sont des nombres avec des décimales.

Le résultat doit être:

5G 624.26 168.20 4g 2 .44

Avez-vous une idée de comment y parvenir? J'essaye de faire cette analyse en Python.


4 commentaires

À partir de la sortie attendue, il semble que vous vouliez tous les mots commençant par un nombre. Est-ce correct?


Pouvez-vous partager ce que vous avez essayé?


avez-vous essayé "[4-5] [Gg]" ? Je ne vois pas pourquoi cela ne fonctionnerait pas.


Lorsque vous posez une question regex, il est toujours utile de fournir au moins quelques cas de test réussis et échoués. Contrairement à d'autres choses, regex a vraiment besoin des deux cas. Plus de cas vous permettront d'obtenir une meilleure expression régulière correspondante.


3 Réponses :


1
votes

Je le séparerais en différents groupes de capture comme ceci:

(? i) (? P 5? 4? G) \ sDL \ s (? P [^ \ s] *) \ sUP \ s (? P [ ^ \ s] *)

(? i) rend l'ensemble de l'expression régulière insensible à la casse

(? P 5? 4? G) est le premier groupe correspondant sur 4g, 5g, 4G ou 5G.

(? P [^ \ s] *) est le deuxième et le troisième groupe correspondant à tout ce qui n'est pas un espace.

Ensuite, en Python, vous pouvez faire:

match = re.match ('(? i) (? P 5? 4? G) \ sDL \ s (? P [^ \ s] *) \ sUP \ s (? P [^ \ s] *) ', entrée)

Et accédez à chaque groupe comme ceci:

match.group ('g1') etc.


0 commentaires

0
votes
(5G|4G)\sDL\s(\d*[.]?\d*)\sUP\s(\d*[.]?\d*)
with gi flags (global, case insensitive) should work. You can modify the digit matching since I'm unsure if it's necessarily a decimal or not. 

3 commentaires

([\ d.] +) capturera une combinaison arbitraire de chiffres et de décimales, donc peut-être une meilleure option dans ce cas


C'est vrai, mais en même temps, il ne serait pas logique d'avoir plusieurs décimales dans le même nombre. Bien que probablement un non-facteur, on ne sait pas ce qui pourrait être dans le corps du texte.


Hé, OP a dit tous les chiffres et points. Cela signifie tous les chiffres et toutes les périodes, non? :-)



1
votes

Je suis d'accord avec les réponses qui disent d'utiliser des groupes de capture, mais j'ai une approche légèrement différente pour l'expression régulière elle-même. Veillez à utiliser les options gi (globales et non sensibles à la casse) pour obtenir les bons résultats.

import re

regex = r"([45]G).*?([\d.]+).*?([\d.]+)"

test_str = "Put in 3 extenders but by the 4th floor it is weak on signal these don't piggy back of each other. ST -99. 5G DL 624.26 UP 168.20 4g DL 2 Up .44"

matches = re.finditer(regex, test_str, re.IGNORECASE)

for matchNum, match in enumerate(matches, start=1):

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1

        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

J'inclus le lien vers testeur et débogueur de regex en ligne que j'ai utilisé car il explique très bien les éléments individuels de l'expression régulière, et j'ai également copié dans l'exemple de code python il a généré ci-dessous.

r"([45]G).*?([\d.]+).*?([\d.]+)"


0 commentaires