Traitement du langage 100 coups 2015 ["Chapitre 3: Expressions régulières"](http: //www.cl.ecei.tohoku) Il s'agit d'un enregistrement du 22e "Nom de la catégorie d'extrait" de .ac.jp / nlp100 / # ch3). Cette fois, nous utiliserons ** correspondance non capturée / non gourmande **. La bonne chose à propos de ces 100 coups est que vous pouvez apprendre le contenu petit à petit.
Lien | Remarques |
---|---|
022.Extraction du nom de la catégorie.ipynb | Lien GitHub du programme de réponse |
100 coups de traitement du langage amateur:22 | 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é "titre" et le corps de l'article est stocké dans l'objet dictionnaire avec la clé "texte", et cet objet est écrit au format JSON. --Le fichier est entièrement compressé
Créez un programme qui effectue le traitement suivant.
Extraire les noms des catégories d'articles (par nom, pas ligne par ligne).
Selon Aide: Référence rapide, la «catégorie» est «[[Category : Aide | Hayami Hiyo]] format. Extrayez la partie "
help` "dans ce format.
Dans le fichier, la partie «catégorie» comprend les données suivantes.
Extrait de la partie "catégorie" du dossier
[[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]]'
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
#Recherchez des chaînes courtes en en faisant une correspondance non gourmande
print(re.findall(r'''
^ #Le début de la chaîne(Même si vous ne l'avez pas, le résultat ne changera pas, mais je le mettrai en)
\[\[Category: #Terme de recherche(\Est un traitement d'échappement)
( #Commencer le regroupement pour être capturé
.*? #Correspondance non gourmande pour toute chaîne de 0 ou plus
) #Fin du regroupement à capturer
(?: #Commencer à grouper hors de la capture
\| #Terme de recherche'|'
.* #Toute chaîne de caractères de 0 caractère ou plus
)? #Fin du regroupement sans capture(0/Cible d'apparence une fois)
\]\] #Terme de recherche(\Est un traitement d'échappement)
$ #Fin de chaîne(Même si vous ne l'avez pas, le résultat ne changera pas, mais je le mettrai en)
''', wiki_body, re.MULTILINE+re.VERBOSE))
La partie principale de ce temps est la partie suivante.
python
print(re.findall(r'''
^ #Le début de la chaîne(Même si vous ne l'avez pas, le résultat ne changera pas, mais je le mettrai en)
\[\[Category: #Terme de recherche(\Est un traitement d'échappement)
( #Commencer le regroupement pour être capturé
.*? #Correspondance non gourmande pour toute chaîne de 0 ou plus
) #Fin du regroupement à capturer
(?: #Commencer à grouper hors de la capture
\| #Terme de recherche'|'
.* #Toute chaîne de caractères de 0 caractère ou plus
)? #Fin du regroupement sans capture(0/Cible d'apparence une fois)
\]\] #Terme de recherche(\Est un traitement d'échappement)
$ #Fin de chaîne(Même si vous ne l'avez pas, le résultat ne changera pas, mais je le mettrai en)
''', wiki_body, re.MULTILINE+re.VERBOSE))
?: ...
](https://qiita.com/FukuharaYohei/items/459f27f0d7bbba551af7#%E3%82%AD%E3%83%A3%E3%83%97%E3%83 % 81% E3% 83% A3% E5% AF% BE% E8% B1% A1% E5% A4% 96)Si vous ajoutez (?: ...)
, il ne sera pas inclus dans la chaîne de résultat de la recherche ** et ne sera pas capturé.
Cette fois[[Category:Aidez-moi|Hiyo Hayami]]
Formel|Graphique simplifié
Je ne veux pas capturer la pièce, donc je ne la capture pas.
Dans l'exemple ci-dessous, la partie «4» est utilisée comme modèle d'expression régulière, mais elle n'est pas sortie dans le résultat.
>>> re.findall(r'(.012)(?:4)', 'A0123 B0124 C0123')
['B012']
** Vous pouvez contrôler la longueur de la chaîne de caractères cible du résultat de la recherche **. ** La correspondance de longueur maximale est une correspondance gourmande, et la correspondance de longueur minimale est une correspondance non gourmande **. La valeur par défaut est une correspondance gourmande.
Cette fois[[Category:Aidez-moi|Hiyo Hayami]]
Au format|Hiyo Hayami
Partie de 0/Puisqu'il apparaît une fois, si vous n'en faites pas une correspondance non gourmande, ce sera 0 fois|Hiyo Hayami]]
Sera acquis.
#Match gourmand
>>> print(re.findall(r'.0.*2', 'A0123 B0123'))
['A0123 B012']
#Match non gourmand(*Après le?)
>>> print(re.findall(r'.0.*?2', 'A0123 B0123'))
['A012', 'B012']
Lorsque le programme est exécuté, les résultats suivants sont affichés.
Résultat de sortie
['Angleterre', 'Royaume du Royaume-Uni', 'Pays membres du G8', 'Pays membres de l'Union européenne', 'Nation marine', 'Pays souverain', 'Pays insulaire', 'État / région créé en 1801']
Recommended Posts