Traitement du langage 100 coups 2015 ["Chapitre 3: Expressions régulières"](http: //www.cl.ecei.tohoku) .ac.jp / nlp100 / # ch3) 21e "Ligne d'extraction contenant le nom de la catégorie" enregistrement. La dernière fois était une préparation, et cette fois, c'est la pratique des expressions régulières. Jusqu'à présent, Gugu utilise beaucoup de contenu de base dont je me souviens. Plus précisément, il regorge de bases telles que ** chaîne de caractères brute, re.VERBOSE, re.MULTILINE, guillemet triple **.
Lien | Remarques |
---|---|
021.Extraire des lignes contenant des noms de catégories.ipynb | Lien GitHub du programme de réponse |
100 coups de traitement du langage amateur:21 | Copiez et collez la source de nombreuses pièces source |
Apprenez les bases et les astuces des expressions canoniques Python à partir de zéro | J'ai organisé ce que j'ai appris dans ce coup |
Expression régulière HOWTO | Expression régulière officielle Python Comment faire |
re ---Opération d'expression régulière | Description officielle du paquet Python re |
Help:Graphique simplifié | Wikipediaの代表的なマークアップのGraphique simplifié |
type | version | Contenu |
---|---|---|
OS | Ubuntu18.04.01 LTS | Il fonctionne virtuellement |
pyenv | 1.2.15 | J'utilise pyenv car j'utilise parfois plusieurs environnements Python |
Python | 3.6.9 | python3 sur pyenv.6.J'utilise 9 3.7 ou 3.Il n'y a aucune raison profonde de ne pas utiliser la série 8 Les packages sont gérés à l'aide de venv |
Dans l'environnement ci-dessus, j'utilise les packages Python supplémentaires suivants. Installez simplement avec pip ordinaire.
type | version |
---|---|
pandas | 0.25.3 |
En appliquant des expressions régulières à la description du balisage sur la page Wikipédia, diverses informations et connaissances peuvent être extraites.
Expressions régulières, JSON, Wikipedia, InfoBox, services web
Un fichier jawiki-country.json.gz qui exporte les articles Wikipédia au format suivant Il y a.
- Une information d'article par ligne est stockée au format JSON --Dans chaque ligne, le nom de l'article est stocké dans la clé "title" et le corps de l'article est stocké dans l'objet dictionnaire avec la clé "text", et cet objet est écrit au format JSON. --Le fichier est entièrement compressé
Créez un programme qui effectue le traitement suivant.
Extrayez la ligne qui déclare le nom de la catégorie dans l'article.
Selon Aide: Référence rapide, le "nom de la catégorie" est «[[[ Catégorie: Aide | Hayami Hiyo]] `format. Extrayez la partie suivante du fichier avec une expression régulière.
Extrait de la partie "nom de la catégorie" du fichier
[[Category:Angleterre|*]]\n'
[[Category:Royaume du Royaume-Uni|*]]\n'
[[Category:Pays membres du G8]]\n'
[[Category:Pays membres de l'Union européenne]]\n'
[[Category:Nation marine]]\n'
[[Category:Pays souverain]]\n'
[[Category:Pays insulaire|Kureito Furiten]]\n'
[[Category:État / région créé en 1801]]'
from pprint import pprint
import re
import pandas as pd
def extract_by_title(title):
df_wiki = pd.read_json('jawiki-country.json', lines=True)
return df_wiki[(df_wiki['title'] == title)]['text'].values[0]
wiki_body = extract_by_title('Angleterre')
#Ignorer la séquence d'échappement dans la chaîne brute lorsque r est au début
#Ignorer les pauses au milieu avec des guillemets triples
# re.Ignorer les espaces et les commentaires à l'aide de l'option VERBOSE
# re.Rechercher plusieurs lignes avec MULTILINE
pprint(re.findall(r'''
^ #Le début de la chaîne(Le résultat ne change pas même s'il n'est pas inclus)
( #Commencer à grouper
.* #Toute chaîne de caractères de 0 caractère ou plus
\[\[Category: #Terme de recherche(\Est un traitement d'échappement)
.* #Toute chaîne de caractères de 0 caractère ou plus
\]\] #Terme de recherche(\Est un traitement d'échappement)
.* #Toute chaîne de caractères de 0 caractère ou plus
) #Fin du regroupement
$ #Fin de chaîne(Le résultat ne change pas même s'il n'est pas inclus)
''', wiki_body, re.MULTILINE+re.VERBOSE))
Le sujet principal de ce coup est le suivant.
pprint(re.findall(r'''
^ #Le début de la chaîne(Le résultat ne change pas même s'il n'est pas inclus)
( #Commencer à grouper
.* #Toute chaîne de caractères de 0 caractère ou plus
\[\[Category: #Terme de recherche(\Est un traitement d'échappement)
.* #Toute chaîne de caractères de 0 caractère ou plus
\]\] #Terme de recherche(\Est un traitement d'échappement)
.* #Toute chaîne de caractères de 0 caractère ou plus
) #Fin du regroupement
$ #Fin de chaîne(Le résultat ne change pas même s'il n'est pas inclus)
''', wiki_body, re.MULTILINE+re.VERBOSE))
findall
La fonction findall
** renvoie toutes les chaînes qui correspondent au modèle au format liste **.
L'exemple suivant extrait tous les mots complémentaires qui se terminent par ly
( \ w
est "caractères alphabétiques et soulignés" #% E7% 89% B9% E6% AE% 8A% E6% 96% 87% E5% AD% 97)).
findall exemple
>>> text = "He was carefully disguised but captured quickly by police."
>>> re.findall(r"\w+ly", text)
['carefully', 'quickly']
Faites précéder le guillemet de r
pour en faire une chaîne brute. Vous pouvez désactiver la séquence d'échappement à l'aide d'une chaîne brute. ** Si le modèle d'expression régulière a une séquence d'échappement, il est difficile à lire, alors faites-en une chaîne brute et invalidez-la **.
Exemple de sortie d'impression de chaîne brute
>>> print('a\tb\nA\tB')
a b
A B
>>> print(r'a\tb\nA\tB')
a\tb\nA\tB
Vous pouvez utiliser des sauts de ligne dans le modèle d'expression régulière en les mettant entre guillemets triples `` '' (également possible avec
" "" `). ** Régulier par sauts de ligne Rend le modèle d'expression plus facile à lire **
Exemple d'utilisation de triple devis
a = re.compile(r'''\d +
\.
\d *''')
re.VERBOSE
](https://qiita.com/FukuharaYohei/items/459f27f0d7bbba551af7#%E3%83%88%E3%83%AA%E3%83%97%E3%83%AB%E3%82 % AF% E3% 82% A9% E3% 83% BC% E3% 83% 88% E3% 81% A8reverbose% E3% 81% A7% E6% 94% B9% E8% A1% 8C% E3% 82% B3 % E3% 83% A1% E3% 83% B3% E3% 83% 88% E7% A9% BA% E7% 99% BD% E7% 84% A1% E8% A6% 96)En passant re.VERBOSE
au paramètre flags
, vous pouvez utiliser des commentaires et des blancs dans le modèle d'expression régulière (peu importe si vous ne l'utilisez pas). ** Facilitez la lecture du modèle d'expression régulière en insérant un commentaire et un espace **. Il s'agit d'une méthode d'amélioration de la lisibilité utilisée en combinaison avec des guillemets triples.
Exemple d'utilisation de triple devis
a = re.compile(r'''\d + # the integral part
\. # the decimal point
\d * # some fractional digits''', re.VERBOSE)
re.MULTILINE
Utilisez cette option lorsque vous souhaitez rechercher plusieurs lignes.
re.Exemple d'utilisation MULTILINE
string = r'''\
1ère ligne
2e ligne au début de la ligne'''
#Rechercher la cible pour plusieurs lignes
print(re.findall(r'^Début de ligne.*', string, re.MULTILINE))
# ['1ère ligne', '2e ligne au début de la ligne']
#Seule la première ligne est recherchée
print(re.findall(r'^Début de ligne.*', string))
# ['1ère ligne']
Lorsque le programme est exécuté, les résultats suivants sont affichés.
Résultat de sortie
['[[Category:Angleterre|*]]',
'[[Category:Royaume du Royaume-Uni|*]]',
'[[Category:Pays membres du G8]]',
'[[Category:Pays membres de l'Union européenne]]',
'[[Category:Nation marine]]',
'[[Category:Pays souverain]]',
'[[Category:Pays insulaire|Kureito Furiten]]',
'[[Category:État / région créé en 1801]]']
Recommended Posts