Voici un exemple de mes phrases d'entrée. Je veux extraire des nombres de phrases qui se terminent par mm ou cm. Voici l'expression régulière que j'ai essayé de créer.
['1.9x1.4x2.0'] or ['1.9', '1.4', '2.0']
Cela donne la sortie comme
['1', '9', '1', '4', '2', '0']
Ensuite, j'ai juste essayé d'extraire des nombres sans conditions comme
print (re.findall('\d+', sen ))
5 Réponses :
Vous pouvez utiliser une anticipation avec re.findall:
['1.9x1.4x2.0']
Output:
import re sen = 'The study reveals a speculated nodule with pleural tagging at anterior basal segment of LLL, measured 1.9x1.4x2.0 cm in size' result = re.findall(r'[\dx\.]+(?=\scm)', sen)
Essayez ceci:
['1.9', '1.4', '2.0']
Sortie :
sen = 'The study reveals a speculated nodule with pleural tagging at anterior basal segment of LLL, measured 1.9x1.4x2.0 cm in size'
import re
re.findall('\d+\.\d+', sen)
Voici une autre approche:
['1.9', '1.4', '2.0']
sortie:
import re
sen = 'The study reveals a speculated nodule with pleural tagging at anterior basal segment of LLL, measured 1.9x1.4x2.0 cm in size'
output = re.findall('\d.\d', sen)
['1.9', '1.4', '2.0']
Vous pouvez utiliser 3 groupes de capture pour obtenir les chiffres et vous assurer que les mesures se terminent sur cm ou mm en utilisant un classe de caractères .
\d+(?:\.\d+)?(?:(?:x\d+(?:\.\d+)?)*)?(?=[ \t]+[cm]m)
En parties
(? Regard négatif en arrière, affirmer que ce qui est directement à gauche n'est pas un caractère non blanc (\ d + \. \ d +) x Capturez le groupe 1 , faites correspondre plus de 1 chiffres et une partie décimale, puis
correspond à x (\ d + \. \ d +) x Capturer le groupe 2 comme ci-dessus (\ d +. \ d +) Capturer le groupe 3 Match 1+ chiffres et une partie décimale [cm] m Faire correspondre cm ou mm (?! \ S) Lookahead négatif, affirmer que ce qui est directement à gauche n'est pas un caractère non blanc Par exemple
['1.9x1.4x2.0']
Sortie
(?<!\S)(\d+\.\d+x\d+\.\d+x\d+\.\d+) [cm]m(?!\S)
Pour obtenir la sortie comprenant le x , vous pouvez utiliser
[('1.9', '1.4', '2.0')]
Output
import re regex = r"(?<!\S)(\d+\.\d+)x(\d+\.\d+)x(\d+\.\d+) [cm]m(?!\S)" test_str = "The study reveals a speculated nodule with pleural tagging at anterior basal segment of LLL, measured 1.9x1.4x2.0 cm in size" print(re.findall(regex, test_str))
Modifier
Pour ne faire correspondre que les valeurs et laisser 1 ou plusieurs espaces entre les chiffres et la valeur, vous pouvez utiliser une anticipation positive:
(?<!\S)(\d+\.\d+)x(\d+\.\d+)x(\d+\.\d+) [cm]m(?!\S)
Je me demande pourquoi cela ne fonctionne pas pour une phrase comme "Deux autres petites lésions de verre dépoli mal définies mesuraient respectivement 4,0 mm et 3 mm." S'il te plait peux-tu aider?
@pari Si vous voulez également correspondre à ce format, vous pouvez rendre la première partie qui pourrait contenir x facultative. (? Voir regex101.com/r/AeM6Gp/1
alors me suggérez-vous de supprimer "x" dans la deuxième étape ou puis-je écrire quelque chose qui en une seule étape pour extraire les nombres se terminant par mm ou cm et en supprimant également "x"?
@pari Cela dépend de ce que vous voulez faire correspondre. Vous pouvez rendre toutes les pièces facultatives comme ceci regex101.com/r/CDBSWB/1 ou vous pouvez correspond à la partie entière avec le x ou à une partie distincte regex101.com/r / wH13ns / 1
Veuillez excuser mon ignorance, j'essaye d'apprendre à écrire des regex. df1 ['numbers3'] = [[float (l) or l for l in x] for x in df1 ['TEXT']. str.findall (r '\ d + \. \ d +')] De cette façon, j'extraction les nombres du texte et les convertir en flottant pour des calculs ultérieurs. Avec ce que vous avez suggéré j'ai écrit, df1 ['numbers2'] = [[float (l) ou l pour l dans x] pour x dans df1 ['TEXT']. Str.findall (r '(?
@pari C'est ce que re.findall renvoie Si un ou plusieurs groupes sont présents dans le modèle, renvoyez une liste de groupes; ce sera une liste de tuples si le motif a plus d'un groupe
Je souhaite extraire uniquement des nombres se terminant par «mm» ou «cm» et non des nombres aléatoires. D'autres calculs seraient comme si c'était mm, je le convertirais en cm.
@pari Si vous voulez un seul groupe de capture, vous pouvez utiliser (\ d + (?: \. \ d +)? (? :( ?: x \ d + (?: \. \ d +)?) *)? ) [cm] m regex101.com/r/CzdRda/1 et utilisez le groupe de capture dans le remplacement. Le mm ou cm qui correspond, vous pouvez le remplacer par une autre valeur.
Cette expression régulière ne fonctionnera pas lorsqu'il y a plus d'un espace entre le nombre et mm ou cm. Comment puis-je réparer cette expression régulière pour qu'elle fonctionne même s'il y a plus d'espaces, mais il suffit de vérifier si mm ou cm se trouve après le nombre puisque mes données contiennent cette hétérogénéité?
@pari Vous pouvez utiliser une classe de caractères pour faire correspondre 1+ espaces ou tabulations. Pour obtenir uniquement les valeurs, vous pouvez les faire correspondre sans utiliser de groupe et utiliser une anticipation positive pour affirmer le cm ou mm \ d + (?: \. \ D +)? (? :( ?: x \ d + (?: \. \ d +)?) *)? (? = [\ t] + [cm] m) regex101.com/r/8NnW9D/1
ok cela fonctionne, pouvez-vous modifier votre réponse avec ceci, donc je l'accepterai comme réponse. Aussi, pouvons-nous avoir un chat privé, j'avais plus à discuter?
@pari J'ai ajouté une mise à jour à la réponse avec ce modèle. Si vous avez une autre question, je vous conseille de créer une nouvelle question.
Les nombres n'incluent pas
.etxCopie possible de Extraire la valeur flottante / double