[PYTHON] 100 coups de traitement du langage amateur: 27

C'est un record de défi de 100 langues de traitement knock 2015. L'environnement est Ubuntu 16.04 LTS + Python 3.5.2 : : Anaconda 4.1.1 (64 bits). Cliquez ici pour une liste des coups passés (http://qiita.com/segavvy/items/fb50ba8097d59475f760).

Chapitre 3: Expressions régulières

Il existe un fichier jawiki-country.json.gz qui exporte les articles Wikipedia dans le format suivant. ・ Une information d'article est stockée au format JSON par ligne -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. ・ L'ensemble du fichier est compressé avec gzip Créez un programme qui effectue le traitement suivant.

27. Suppression des liens internes

En plus de traiter> 26, supprimez le balisage de lien interne de MediaWiki de la valeur du modèle et convertissez-le en texte (Référence: [Markup Quick Reference](https://ja.wikipedia.org/wiki/Help :) Graphique simplifié)).

Le code fini:

main.py


# coding: utf-8
import gzip
import json
import re
fname = 'jawiki-country.json.gz'


def extract_UK():
	'''Obtenez le corps d'un article sur l'Angleterre

Valeur de retour:
Texte d'article britannique
	'''

	with gzip.open(fname, 'rt') as data_file:
		for line in data_file:
			data_json = json.loads(line)
			if data_json['title'] == 'Angleterre':
				return data_json['text']

	raise ValueError('Je ne trouve pas d'article britannique')


def remove_markup(target):
	'''Suppression du balisage
Supprimer les annotations et les liens internes en surbrillance

argument:
	target --Chaîne de caractères cible
Valeur de retour:
Chaîne avec balisage supprimé
	'''

	#Suppression du balisage en surbrillance
	pattern = re.compile(r'''
		(\'{2,5})	#2-5'(Début du balisage)
		(.*?)		#Un ou plusieurs caractères (chaîne de caractères cible)
		(\1)		#Identique à la première capture (fin du balisage)
		''', re.MULTILINE + re.VERBOSE)
	target = pattern.sub(r'\2', target)

	#Suppression des liens internes
	pattern = re.compile(r'''
		\[\[		# '[['(Début du balisage)
		(?:			#Démarrer un groupe qui n'est pas capturé
			[^|]*?	# '|'0 ou plus de caractères autres que, non gourmand
			\|		# '|'
		)??			#Fin du groupe, ce groupe apparaît 0 ou 1, non gourmand
		([^|]*?)	#Capturer la cible,'|'Autre que 0 caractère, non gourmand (chaîne de caractères à afficher)
		\]\]		# ']]'(Fin du balisage)
		''', re.MULTILINE + re.VERBOSE)
	target = pattern.sub(r'\1', target)

	return target


#Compilation des conditions d'extraction du modèle d'informations de base
pattern = re.compile(r'''
	^\{\{Informations de base.*?$	# '{{Informations de base'Lignes commençant par
	(.*?)		#Capturer la cible, n'importe quel 0 caractère ou plus, non gourmand
	^\}\}$		# '}}'Ligne
	''', re.MULTILINE + re.VERBOSE + re.DOTALL)

#Extraction du modèle d'informations de base
contents = pattern.findall(extract_UK())

#Compilation des conditions d'extraction du nom du champ et de la valeur du résultat de l'extraction
pattern = re.compile(r'''
	^\|			# '|'Lignes commençant par
	(.+?)		#Cible de capture (nom du champ), un ou plusieurs caractères, non gourmand
	\s*			#0 ou plusieurs caractères vides
	=
	\s*			#0 ou plusieurs caractères vides
	(.+?)		#Capturer la cible (valeur), un ou plusieurs caractères, non gourmand
	(?:			#Démarrer un groupe qui n'est pas capturé
		(?=\n\|) 	#nouvelle ligne+'|'Avant (anticipation affirmative)
		| (?=\n$)	#Ou un saut de ligne+Avant la fin (anticipation affirmative)
	)			#Fin du groupe
	''', re.MULTILINE + re.VERBOSE + re.DOTALL)

#Extraction des noms de champs et des valeurs
fields = pattern.findall(contents[0])

#Définir dans le dictionnaire
result = {}
keys_test = []		#Liste des noms de champs par ordre d'apparition pour confirmation
for field in fields:
	result[field[0]] = remove_markup(field[1])
	keys_test.append(field[0])

#Affiché pour confirmation (touches pour une confirmation facile_Trier par apparence de nom de champ à l'aide de test)
for item in sorted(result.items(),
		key=lambda field: keys_test.index(field[0])):
	print(item)

Résultat de l'exécution:

Terminal


('Nom abrégé', 'Angleterre')
('Nom du pays japonais', 'Royaume-Uni de Grande-Bretagne et d'Irlande du Nord')
('Nom officiel du pays', '{{lang|en|United Kingdom of Great Britain and Northern Ireland}}<ref>Nom officiel du pays autre que l'anglais:<br/>\n*{{lang|gd|An Rìoghachd Aonaichte na Breatainn Mhòr agus Eirinn mu Thuath}}(Gaélique écossais)<br/>\n*{{lang|cy|Teyrnas Gyfunol Prydain Fawr a Gogledd Iwerddon}}(Pays de Galles)<br/>\n*{{lang|ga|Ríocht Aontaithe na Breataine Móire agus Tuaisceart na hÉireann}}(Irlandais)<br/>\n*{{lang|kw|An Rywvaneth Unys a Vreten Veur hag Iwerdhon Glédh}}(Cornouailles)<br/>\n*{{lang|sco|Unitit Kinrick o Great Breetain an Northren Ireland}}(Écossais)<br/>\n**{{lang|sco|Claught Kängrick o Docht Brätain an Norlin Airlann}}、{{lang|sco|Unitet Kängdom o Great Brittain an Norlin Airlann}}(Ulster écossais)</ref>')
('Image du drapeau', 'Flag of the United Kingdom.svg')
('Image de l'emblème national', '[[Fichier:Royal Coat of Arms of the United Kingdom.svg|85px|Emblème national britannique]]')
('Lien de l'emblème national', '(Emblème national)')
('Slogan', '{{lang|fr|Dieu et mon droit}}<br/>(Français:Dieu et mes droits)')
('Hymne national', 'Protégez Sa Majesté la Reine, Dieu')
('Image de position', 'Location_UK_EU_Europe_001.svg')
('Terminologie officielle', 'Anglais (virtuellement)')
('Capitale', 'Londres')
('Ville la plus grande', 'Londres')
('Ancien titre de la tête', 'Reine')
('Prénom', 'Elizabeth II')
('Titre de premier ministre', 'premier ministre')
('Nom du premier ministre', 'David Cameron')
('Classement de la zone', '76')
('Taille de la zone', '1 E11')
('Valeur de la zone', '244,820')
('Rapport de surface d'eau', '1.3%')
('Année du recensement', '2011')
('Classement de la population', '22')
('Taille de la population', '1 E7')
('Valeur de la population', '63,181,775<ref>[http://esa.un.org/unpd/wpp/Excel-Data/population.htm United Nations Department of Economic and Social Affairs>Population Division>Data>Population>Total Population]</ref>')
('Valeur de densité de population', '246')
('Statistiques du PIB année yuan', '2012')
('Source de valeur du PIB', '1547,8 milliards<ref name="imf-statistics-gdp">[http://www.imf.org/external/pubs/ft/weo/2012/02/weodata/weorept.aspx?pr.x=70&pr.y=13&sy=2010&ey=2012&scsm=1&ssd=1&sort=country&ds=.&br=1&c=112&s=NGDP%2CNGDPD%2CPPPGDP%2CPPPPC&grp=0&a= IMF>Data and Statistics>World Economic Outlook Databases>By Countrise>United Kingdom]</ref>')
('Statistiques du PIB Année MER', '2012')
('Classement du PIB MER', '5')
('Valeur du PIB RFG', '2433,7 milliards<ref name="imf-statistics-gdp" />')
('Année statistique du PIB', '2012')
('Classement du PIB', '6')
('Valeur du PIB', '2316,2 milliards<ref name="imf-statistics-gdp" />')
('GDP/Homme', '36,727<ref name="imf-statistics-gdp" />')
('Forme fondatrice', 'Fondation du pays')
('Forme établie 1', 'Royaume d'Angleterre / Royaume d'Écosse<br />(Les deux pays jusqu'à l'acte d'Union de 1707)')
('Date de création 1', '927/843')
('Forme établie 2', 'Fondation du Royaume de Grande-Bretagne<br />(Acte de l'Union 1707)')
('Date d'établissement 2', '1707')
('Forme établie 3', 'Fondation du Royaume-Uni de Grande-Bretagne et d'Irlande<br />(Loi de l'Union 1800)')
('Date d'établissement 3', '1801')
('Forme établie 4', 'Changement du nom de pays actuel "Grande-Bretagne et Royaume-Uni d'Irlande du Nord"')
('Date de création 4', '1927')
('devise', 'Livre britannique(&pound;)')
('Code de devise', 'GBP')
('Fuseau horaire', '±0')
('Heure d'été', '+1')
('ISO 3166-1', 'GB / GBR')
('ccTLD', '.uk / .gb<ref>L'utilisation est.Un nombre extrêmement faible par rapport au Royaume-Uni.</ref>')
('Numéro de téléphone international', '44')
('Remarque', '<references />')

Suppression du lien interne "uniquement"

[Question précédente] remove_markup () de (http://qiita.com/segavvy/items/f6d0f3d6eee5acc33c58) a été réparé. Ce à quoi je suis accro cette fois, c'est que ça marche bien! Si vous pensez et vérifiez[[Fichier:Royal Coat of Arms of the United Kingdom.svg|85px|Emblème national britannique]]QuandいったFichierの指定まで巻き込んでいたこQuandです。そこで、[[Quand]]Dans la gamme délimitée par|が0または1個しか出てこないQuandいう条件に変更して(Fichierの場合は2個出てくる)、Fichierを巻き込むのを防いでみました。 Cependant, cela inclut des catégories telles que «[[Category: UK | *]]» qui ont été ciblées dans les numéros 21 et 22 et [Markup Quick Reference](https://ja.wikipedia.org/wiki/Help: C'est un peu à mi-chemin car cela implique une redirection telle que #REDIRECT [[nom de l'article]] dans le tableau de référence rapide). Ce n'est pas grave car cela n'apparaît pas dans les données cibles cette fois-ci, mais cela n'a peut-être pas répondu à l'intention de la question ...

C'est tout pour le 28e coup. Si vous avez des erreurs, je vous serais reconnaissant de bien vouloir les signaler.


Recommended Posts

100 coups de traitement du langage amateur: 41
100 coups de traitement du langage amateur: 71
100 coups de traitement du langage amateur: 24
100 coups de traitement du langage amateur: 50
100 coups de traitement du langage amateur: 70
100 coups de traitement du langage amateur: 62
100 coups de traitement du langage amateur: 60
100 coups de traitement du langage amateur: 92
100 coups de langue amateur: 30
100 coups de langue amateur: 06
100 coups de traitement du langage amateur: 84
100 coups de traitement du langage amateur: 81
100 coups de langue amateur: 33
100 coups de traitement du langage amateur: 46
100 coups de traitement du langage amateur: 88
100 coups de traitement du langage amateur: 89
100 coups de traitement du langage amateur: 40
100 coups de traitement du langage amateur: 45
100 coups de traitement du langage amateur: 43
100 coups de traitement du langage amateur: 55
100 coups de traitement du langage amateur: 22
100 coups de traitement du langage amateur: 61
100 coups de traitement du langage amateur: 94
100 coups de traitement du langage amateur: 54
100 coups de langue amateur: 04
100 coups de traitement du langage amateur: 63
100 coups de traitement du langage amateur: 78
100 coups de langue amateur: 08
100 coups de traitement du langage amateur: 42
100 coups de traitement du langage amateur: 19
100 coups de traitement du langage amateur: 73
100 coups de traitement du langage amateur: 75
100 coups de traitement du langage amateur: 83
100 coups de traitement du langage amateur: 95
100 coups de traitement du langage amateur: 96
100 coups de traitement du langage amateur: 72
100 coups de traitement du langage amateur: 79
100 coups de traitement du langage amateur: 23
100 coups de langue amateur: 05
100 coups de langue amateur: 00
100 coups de langue amateur: 02
100 coups de traitement du langage amateur: 37
100 coups de traitement du langage amateur: 21
100 coups de traitement du langage amateur: 68
100 coups de traitement du langage amateur: 11
100 coups de traitement du langage amateur: 90
100 coups de traitement du langage amateur: 66
100 coups de traitement du langage amateur: 28
100 coups de traitement du langage amateur: 64
100 coups de traitement du langage amateur: 34
100 coups de traitement du langage amateur: 77
100 coups de langue amateur: 01
100 coups de traitement du langage amateur: 16
100 coups de traitement du langage amateur: 27
100 coups de traitement du langage amateur: 10
100 coups de traitement du langage amateur: 03
100 coups de traitement du langage amateur: 82
100 coups de traitement du langage amateur: 69
100 coups de traitement du langage amateur: 53
100 coups de traitement du langage amateur: 18
100 coups de traitement du langage amateur: 35