J'ai une chaîne dont je veux extraire un sous-ensemble. Cela fait partie d'un plus grand script Python.
Voici la chaîne:
import re
htmlString = '</dd><dt> Fine, thank you. </dt><dd> Molt bé, gràcies. (<i>mohl behh, GRAH-syuhs</i>)'
Que je veux retirer "Molt bé, gràcies. Mohl behh, GRAH-syuhs". Et pour cela, j'utilise l'expression régulière en utilisant re.search
:
SearchStr = '(\<\/dd\>\<dt\>)+ ([\w+\,\.\s]+)([\&\#\d\;]+)(\<\/dt\>\<dd\>)+ ([\w\,\s\w\s\w\?\!\.]+) (\(\<i\>)([\w\s\,\-]+)(\<\/i\>\))'
Result = re.search(SearchStr, htmlString)
print Result.groups()
AttributeError: 'NoneType' object has no attribute 'groups'
Puisque Result.groups()
ne fonctionne pas, les extractions que je veux faire non plus (c'est-à-dire Result.group(5)
et Result.group(7)
). Mais je ne comprends pas pourquoi j'obtiens cette erreur? L'expression régulière fonctionne dans TextWrangler, pourquoi pas en Python? Je suis un débutant en Python.
import re
htmlString = '</dd><dt> Fine, thank you. </dt><dd> Molt bé, gràcies. (<i>mohl behh, GRAH-syuhs</i>)'
SearchStr = '(\<\/dd\>\<dt\>)+ ([\w+\,\.\s]+)([\&\#\d\;]+)(\<\/dt\>\<dd\>)+ ([\w\,\s\w\s\w\?\!\.]+) (\(\<i\>)([\w\s\,\-]+)(\<\/i\>\))'
Result = re.search(SearchStr.decode('utf-8'), htmlString.decode('utf-8'), re.I | re.U)
print Result.groups()
Fonctionne de cette façon. L'expression contient des caractères non latins, elle échoue donc généralement. Vous devez décoder en Unicode et utiliser le drapeau re.U (Unicode).
Je suis aussi débutant et j'ai moi-même fait face à ce problème à quelques reprises.
Vous obtenez AttributeError
parce que vous appelez groups
sur None
, qui n'a aucune méthode.
regex.search
renvoyant None
signifie que l'expression régulière n'a pas pu trouver quelque chose correspondant au modèle de la chaîne fournie.
lors de l'utilisation de regex, il est agréable de vérifier si une correspondance a été établie:
Result = re.search(SearchStr, htmlString)
if Result:
print Result.groups()