[Python]Expression Régulière

Fermé
lovelylulu Messages postés 1 Date d'inscription mercredi 18 avril 2012 Statut Membre Dernière intervention 18 avril 2012 - 18 avril 2012 à 18:14
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 - 24 avril 2012 à 16:19
Bonjour,

J'ai un problème avec mon code. J'aimerais que mon programme me renvoie true ou false selon les deux cas...
Si mon texte commence par un mot qui commence en majuscule renvoie true
Si il y a une ponctuation [".", "?", "!"] et ensuite un mot qui commence en majuscule renvoie true
Si il y a une ponctuation suivie d'un mot qui commence en minuscule renvoie false

Voilà ce qui me pose problème :

l=re.findall(r"[\w']+|[.,!?:]",line)
print(l)
for i in range(0,len(l)-1):
if l[i] in ".?!" and l[i+1]==r"[A-Z]\w*":
print("ok")
else:
print("ligne",ligne," est faux:",l[i+1])

Merci pour votre aide

4 réponses

dodoecchi Messages postés 454 Date d'inscription samedi 9 septembre 2006 Statut Membre Dernière intervention 26 avril 2012 29
24 avril 2012 à 11:18
Pas besoin d'expressions régulières, python est bien plus flexible ;)

fichier lines.txt

Un mot qui commence par une majuscule
? Quoi?? Cette ligne commande par une ponctuation et est suivie par une majuscule
! ponctuation + minuscule


fichier script.py

# coding=latin-1
file = open("lines.txt","r")

ponctuations = ("?", "!", ",", ";", ".")

for line in file.readlines():
	test = line.strip()
	if not len(test):
		continue
		
	print "\tTest : " + test
		
	if test[0].isupper():
		print "Commence par une majuscule"
	
	elif test.startswith(ponctuations):
		test = test[1:]
		test = test.strip()
		if test[0].isupper():
			print "Commence par un signe de ponctuation + manjuscule"
		else:
			print "Commence par un signe de ponctuation SANS majuscule"
			
	else:
		print u"rien trouvé..."


bon codage ;)

0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
Modifié par heyquem le 24/04/2012 à 12:02
Et si le texte commence par une majuscule mais qu'il y a dans plus loin dans le texte une ponctuation suivie d'une minuscule, ça doit donner False ou True ?

Même question si le texte commence par une minuscule puis plus loin il y a une ponctuation suivie d'une majuscule.

Soit dit en passant, entre une ponctuation et le mot qui la suit, il est possible d'y avoir un ou plusieurs blancs ?

Post scriptum:

ah, il semble que les conditions ne portent que sur le début d'un texte
Merci de préciser
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
24 avril 2012 à 13:36
Une expression régulière convient très bien pour ce problème:


fichier lines.txt

Un mot qui commence par une majuscule

? Quoi?? Cette ligne commence par une ponctuation suivie par une majuscule
! ponctuation + minuscule

À la claire fontaine
   !    Île de Ré
   ,   ::; 





code:

import re

regx = re.compile(' *([?!,;.])? *([A-ZÀÂÆÙÛÜYÇÉÈÊËÏÎÔOE]?).*?(\w?)')

with open("lines.txt","r") as f:
    for line in (x for x in f if x.strip()):
        mat = regx.match(line)
        if mat.group(2):
            ecr = '-True-  : Le premier mot commence par une majuscule' \
                  + (', une ponctuation le précède.' if mat.group(1) else '.')
        elif mat.group(3):
            ecr = '-False- : Le premier mot ne commence pas par une majuscule.'
        else:
            ecr = "-*****- : Il n'y a pas de mot"
        print '-------------------------------------\n%r\n%s' % (line,ecr)





résultat:

-------------------------------------
'Un mot qui commence par une majuscule\n'
-True-  : Le premier mot commence par une majuscule.
-------------------------------------
'? Quoi?? Cette ligne commande par une ponctuation et est suivie par une majuscule\n'
-True-  : Le premier mot commence par une majuscule, une ponctuation le précède.
-------------------------------------
'! ponctuation + minuscule\n'
-False- : Le premier mot ne commence pas par une majuscule.
-------------------------------------
'\xc0 la claire fontaine\n'
-True-  : Le premier mot commence par une majuscule.
-------------------------------------
'   !    \xcele de R\xe9\n'
-True-  : Le premier mot commence par une majuscule, une ponctuation le précède.
-------------------------------------
'   ,   ::;  \n'
-*****- : Il n'y a pas de mot
0
dodoecchi Messages postés 454 Date d'inscription samedi 9 septembre 2006 Statut Membre Dernière intervention 26 avril 2012 29
24 avril 2012 à 14:48
isupper montre vite ses limites car il trouve pas toutes les lettres accentués
en voici une liste un peu plus exaustive tirée de wikipedia
ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØOESþÙÚÛÜÝY

pour du code lisible je prefere ne pas utiliser d'expression régulière. après, peut etre que c'est un exercice où il faut utiliser des regexp... qui sait...

ponctuations = ("?", "!", ",", ";", ".")
accents = "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØOESþÙÚÛÜÝY"

def startsWithUpper(str):
	str = str.strip()
	if len(str) == 0:
		return False
	if str[0].isupper():
		return True
	else:
		for a in accents:
			if str.startswith(a):
				return True
	return False
	
def customTest(str):
	if startsWithUpper(test):
		return True
	
	elif test.startswith(ponctuations):
		return startsWithUpper(test[1:])
	
	else:
		return False
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
24 avril 2012 à 14:57
horreur !
n'emploie pas le nom d'un module comme identifiant: remplace str par ce que tu veux mais qui ne soit pas un identifiant d'un objet défini dans le langage
0
dodoecchi Messages postés 454 Date d'inscription samedi 9 septembre 2006 Statut Membre Dernière intervention 26 avril 2012 29
24 avril 2012 à 15:00
c'est un exemple rien de plus --'
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
Modifié par heyquem le 24/04/2012 à 15:16
dodoecchii, j'ai condensé un peu ton code. C'est l'intérêt de Python: permettre des codes très courts qui restent très compréhensibles

ponctuations = ("?", "!", ",", ";", ".")
accents = "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØOESþÙÚÛÜÝY"

def startsWithUpper(x):
    x = x.strip()
    return False if not x else (x[0].isupper() or any(x.startswith(a) for a in accents))
	


with open('lines.txt') as f:
    for line in f:
        print '---------------------\n%r\n%s' \
              % (line,
                 startsWithUpper(line[1 if line.startswith(ponctuations) else 0:]))
0
dodoecchi Messages postés 454 Date d'inscription samedi 9 septembre 2006 Statut Membre Dernière intervention 26 avril 2012 29
Modifié par dodoecchi le 24/04/2012 à 15:15
chacun sa façon de voir les choses
pour moi, par exemple, le code aéré c'est lisible
le code trop condensé, c'est juste attroce pour apprendre :/

a vouloir trop condenser, t'a bouffé une balise...

(mais j'avoue que "or any" et "with" ne sont pas des structures qui me sont très familières. je vais regarder ça)
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
24 avril 2012 à 15:19
le problème de balise n'avait rien à voir avec la façon d"écrire un code mais celle dont j'avais copié-collé pour modifier un premier jet
0