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

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.

28. Suppression du balisage MediaWiki

En plus de traiter> 27, supprimez autant que possible les balises MediaWiki des valeurs de modèle et formatez les informations de base sur le pays.

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 le balisage MediaWiki autant que possible

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)

	#Liens internes, suppression de fichiers
	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 plus, 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)

	# Template:Suppression de Lang{{lang|Balise de langue|Chaîne}}
	pattern = re.compile(r'''
		\{\{lang	# '{{lang'(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 plus, 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)

	#Suppression des liens externes[http://xxxx] 、[http://xxx xxx]
	pattern = re.compile(r'''
		\[http:\/\/	# '[http://'(Début du balisage)
		(?:			#Démarrer un groupe qui n'est pas capturé
			[^\s]*?	#0 ou plusieurs caractères non vides, non gourmands
			\s		#Vide
		)?			#Fin du groupe, ce groupe apparaît 0 ou 1
		([^]]*?)	#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)

	# <br>、<ref>Suppression
	pattern = re.compile(r'''
		<			# '<'(Début du balisage)
		\/?			# '/'Apparaît 0 ou 1 (dans le cas de la balise de fin/Il y a)
		[br|ref]	# 'br'Ou'ref'
		[^>]*?		# '>'Autre que 0 caractère, non gourmand
		>			# '>'(Fin du balisage)
		''', re.MULTILINE + re.VERBOSE)
	target = pattern.sub('', 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', 'Royaume-Uni de Grande-Bretagne et d'Irlande du Nord Nom officiel du pays non anglais:\n*An Rìoghachd Aonaichte na Breatainn Mhòr agus Eirinn mu Thuath (gaélique écossais)\n*Teyrnas Gyfunol Prydain Fawr a Gogledd Iwerddon (Wale)\n*Ríocht Aontai the na Breataine Móire agus Tuaisceart na hÉireann (irlandais)\n*An Rywvaneth Unys a Vreten Veur hag Iwerdhon Glédh (Cornwall)\n*Unitit Kinrick o Great Breetain an Northren Ireland (écossais)\n**Claught Kängrick o Docht Brätain an Norlin Airlann, Unitet Kängdom o Great Brittain an Norlin Airlann (Alster Scottish)')
('Image du drapeau', 'Flag of the United Kingdom.svg')
('Image de l'emblème national', 'Emblème national britannique')
('Lien de l'emblème national', '(Emblème national)')
('Slogan', 'Dieu et mon droit (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,775United Nations Department of Economic and Social Affairs>Population Division>Data>Population>Total Population')
('Valeur de densité de population', '246')
('Statistiques du PIB année yuan', '2012')
('Source de valeur du PIB', '1547,8 milliards FMI>Data and Statistics>World Economic Outlook Databases>By Countrise>United Kingdom')
('Statistiques du PIB Année MER', '2012')
('Classement du PIB MER', '5')
('Valeur du PIB RFG', '2433,7 milliards')
('Année statistique du PIB', '2012')
('Classement du PIB', '6')
('Valeur du PIB', '2316,2 milliards')
('GDP/Homme', '36,727')
('Forme fondatrice', 'Fondation du pays')
('Forme établie 1', 'Royaume d'Angleterre / Royaume d'Écosse (les deux pays jusqu'en 1707 Union Act)')
('Date de création 1', '927/843')
('Forme établie 2', 'Fondation du Royaume de Grande-Bretagne (Union Act 1707)')
('Date d'établissement 2', '1707')
('Forme établie 3', 'Création du Royaume-Uni de Grande-Bretagne et d'Irlande (Union Act 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 / .utilisation de gb.Un nombre extrêmement faible par rapport au Royaume-Uni.')
('Numéro de téléphone international', '44')
('Remarque', '')

Suppression de fichiers

[Question précédente] remove_markup () de (http://qiita.com/segavvy/items/9a8137f045852bc299d6) a été réparé. Lors de la suppression du lien interne dans la question précédente, le fichier ne doit pas être impliqué en faisant en sorte que seul 0 ou 1 «|» apparaisse dans la plage délimitée par «[[« et «]]». Cependant, cette fois, en ciblant deux ou plus, le fichier est supprimé en même temps que le lien interne.

Suppression de Template: Lang

Template:LangQuand tu regardes{{lang|Balise de langue|Chaîne}}Cela semble être dans le format, donc ceChaîneJ'ai essayé de partir.

Suppression des liens externes

Si vous regardez le ʻexternal link dans le [Table de référence rapide de balisage](https://ja.wikipedia.org/wiki/Help: table de référence rapide), ce sera quand [http://www.example.org caractère d'affichage] Semble avoir besoin de laisser unechaîne d'affichage`, alors j'ai essayé cela.

Suppression d'autres annotations

Le problème est de supprimer le balisage MediaWiki autant que possible, mais en regardant les résultats de la suppression jusqu'à présent, il semble que seuls <br> ʻet ʻ soient laissés, alors supprimez ces deux. Je le fais.

C'est tout pour le 29e coup. Si vous avez des erreurs, j'apprécierais que vous les signaliez.


Recommended Posts

100 coups de traitement du langage amateur: 41
100 coups de traitement du langage amateur: 56
100 coups de traitement du langage amateur: 24
100 coups de traitement du langage amateur: 50
100 coups de traitement du langage amateur: 59
100 coups de traitement du langage amateur: 70
100 coups de traitement du langage amateur: 62
100 coups de traitement du langage amateur: 92
100 coups de langue amateur: 06
100 coups de traitement du langage amateur: 81
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: 43
100 coups de traitement du langage amateur: 55
100 coups de traitement du langage amateur: 94
100 coups de traitement du langage amateur: 54
100 coups de traitement du langage amateur: 63
100 coups de traitement du langage amateur: 78
100 coups de traitement du langage amateur: 12
100 coups de traitement du langage amateur: 14
100 coups de langue amateur: 08
100 coups de traitement du langage amateur: 42
100 coups de traitement du langage amateur: 73
100 coups de traitement du langage amateur: 75
100 coups de traitement du langage amateur: 98
100 coups de traitement du langage amateur: 83
100 coups de traitement du langage amateur: 95
100 coups de traitement du langage amateur: 32
100 coups de traitement du langage amateur: 96
100 coups de traitement du langage amateur: 87
100 coups de traitement du langage amateur: 72
100 coups de traitement du langage amateur: 79
100 coups de langue amateur: 05
100 coups de langue amateur: 00
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: 74
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: 36
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
100 coups de traitement du langage amateur: 91
100 coups de traitement du langage amateur: 15
100 coups de traitement du langage amateur: 38
100 coups de traitement du langage amateur: 86