[Python]Expression Régulière

lovelylulu Messages postés 1 Date d'inscription   Statut Membre Dernière intervention   -  
heyquem Messages postés 759 Date d'inscription   Statut Membre Dernière intervention   -
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
A voir également:

4 réponses

dodoecchi Messages postés 454 Date d'inscription   Statut Membre Dernière intervention   29
 
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   Statut Membre Dernière intervention   131
 
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   Statut Membre Dernière intervention   131
 
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   Statut Membre Dernière intervention   29
 
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   Statut Membre Dernière intervention   131
 
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   Statut Membre Dernière intervention   29
 
c'est un exemple rien de plus --'
0
heyquem Messages postés 759 Date d'inscription   Statut Membre Dernière intervention   131
 
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   Statut Membre Dernière intervention   29
 
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   Statut Membre Dernière intervention   131
 
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