[PYTHON] 100 Amateur-Sprachverarbeitungsklopfen: 28

Es ist ein Herausforderungsrekord von 100 Sprachverarbeitungsklopfen 2015. Die Umgebung ist Ubuntu 16.04 LTS + Python 3.5.2 : : Anaconda 4.1.1 (64-Bit). Klicken Sie hier, um eine Liste der vergangenen Schläge anzuzeigen (http://qiita.com/segavvy/items/fb50ba8097d59475f760).

Kapitel 3: Reguläre Ausdrücke

Es gibt eine Datei jawiki-country.json.gz, die Wikipedia-Artikel im folgenden Format exportiert. ・ Pro Zeile werden eine Artikelinformation im JSON-Format gespeichert -In jeder Zeile wird der Artikelname im Schlüssel "title" und der Artikelkörper im Wörterbuchobjekt mit dem Schlüssel "text" gespeichert, und dieses Objekt wird im JSON-Format ausgeschrieben. ・ Die gesamte Datei wird mit gzip komprimiert Erstellen Sie ein Programm, das die folgende Verarbeitung ausführt.

28. Entfernen des MediaWiki-Markups

Entfernen Sie zusätzlich zur Verarbeitung> 27 MediaWiki-Markups so weit wie möglich aus den Vorlagenwerten und formatieren Sie grundlegende Länderinformationen.

Der fertige Code:

main.py


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


def extract_UK():
	'''Holen Sie sich den Körper eines Artikels über England

Rückgabewert:
Britischer Artikeltext
	'''

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

	raise ValueError('Ich kann keinen britischen Artikel finden')


def remove_markup(target):
	'''Markup-Entfernung
Entfernen Sie das MediaWiki-Markup so weit wie möglich

Streit:
	target --Zielzeichenfolge
Rückgabewert:
Zeichenfolge mit entferntem Markup
	'''

	#Entfernen des markierten Markups
	pattern = re.compile(r'''
		(\'{2,5})	#2-5'(Beginn des Markups)
		(.*?)		#Ein oder mehrere Zeichen (Zielzeichenfolge)
		(\1)		#Entspricht der ersten Aufnahme (Ende des Markups)
		''', re.MULTILINE + re.VERBOSE)
	target = pattern.sub(r'\2', target)

	#Interne Links, Entfernen von Dateien
	pattern = re.compile(r'''
		\[\[		# '[['(Beginn des Markups)
		(?:			#Starten Sie eine Gruppe, die nicht erfasst wird
			[^|]*?	# '|'0 oder mehr Zeichen als nicht gierig
			\|		# '|'
		)*?			#Gruppenende, diese Gruppe erscheint 0 oder mehr, nicht gierig
		([^|]*?)	#Ziel erfassen,'|'Andere als 0 Zeichen, nicht gierig (Zeichenfolge, die angezeigt werden soll)
		\]\]		# ']]'(Ende des Markups)
		''', re.MULTILINE + re.VERBOSE)
	target = pattern.sub(r'\1', target)

	# Template:Entfernung von Lang{{lang|Sprach-Tag|String}}
	pattern = re.compile(r'''
		\{\{lang	# '{{lang'(Beginn des Markups)
		(?:			#Starten Sie eine Gruppe, die nicht erfasst wird
			[^|]*?	# '|'0 oder mehr Zeichen als nicht gierig
			\|		# '|'
		)*?			#Gruppenende, diese Gruppe erscheint 0 oder mehr, nicht gierig
		([^|]*?)	#Ziel erfassen,'|'Andere als 0 Zeichen, nicht gierig (Zeichenfolge, die angezeigt werden soll)
		\}\}		# '}}'(Ende des Markups)
		''', re.MULTILINE + re.VERBOSE)
	target = pattern.sub(r'\1', target)

	#Entfernen von externen Links[http://xxxx] 、[http://xxx xxx]
	pattern = re.compile(r'''
		\[http:\/\/	# '[http://'(Beginn des Markups)
		(?:			#Starten Sie eine Gruppe, die nicht erfasst wird
			[^\s]*?	#0 oder mehr nicht leere Zeichen, nicht gierig
			\s		#Leer
		)?			#Gruppenende, diese Gruppe erscheint 0 oder 1
		([^]]*?)	#Ziel erfassen,']'Andere als 0 Zeichen, nicht gierig (Zeichenfolge, die angezeigt werden soll)
		\]			# ']'(Ende des Markups)
		''', re.MULTILINE + re.VERBOSE)
	target = pattern.sub(r'\1', target)

	# <br>、<ref>Entfernung
	pattern = re.compile(r'''
		<			# '<'(Beginn des Markups)
		\/?			# '/'Erscheint 0 oder 1 (im Fall des End-Tags/Es gibt)
		[br|ref]	# 'br'Oder'ref'
		[^>]*?		# '>'Andere als 0 Zeichen, nicht gierig
		>			# '>'(Ende des Markups)
		''', re.MULTILINE + re.VERBOSE)
	target = pattern.sub('', target)

	return target


#Kompilieren der Extraktionsbedingungen der Basisinformationsvorlage
pattern = re.compile(r'''
	^\{\{Grundinformation.*?$	# '{{Grundinformation'Zeilen beginnend mit
	(.*?)		#Erfassen Sie ein Ziel, 0 oder mehr Zeichen, nicht gierig
	^\}\}$		# '}}'Linie
	''', re.MULTILINE + re.VERBOSE + re.DOTALL)

#Extraktion der Basisinformationsvorlage
contents = pattern.findall(extract_UK())

#Zusammenstellung der Extraktionsbedingungen von Feldname und Wert aus dem Extraktionsergebnis
pattern = re.compile(r'''
	^\|			# '|'Zeilen beginnend mit
	(.+?)		#Erfassen Sie das Ziel (Feldname), ein oder mehrere Zeichen, nicht gierig
	\s*			#0 oder mehr Leerzeichen
	=
	\s*			#0 oder mehr Leerzeichen
	(.+?)		#Erfassen Sie ein Ziel (Wert), ein oder mehrere Zeichen, nicht gierig
	(?:			#Starten Sie eine Gruppe, die nicht erfasst wird
		(?=\n\|) 	#Neue Zeile+'|'Vorher (positive Vorausschau)
		| (?=\n$)	#Oder ein Zeilenumbruch+Vor dem Ende (bejahender Ausblick)
	)			#Gruppenende
	''', re.MULTILINE + re.VERBOSE + re.DOTALL)

#Extraktion von Feldnamen und Werten
fields = pattern.findall(contents[0])

#Im Wörterbuch einstellen
result = {}
keys_test = []		#Liste der Feldnamen in der Reihenfolge ihres Auftretens zur Bestätigung
for field in fields:
	result[field[0]] = remove_markup(field[1])
	keys_test.append(field[0])

#Zur Bestätigung angezeigt (Tasten zur einfachen Bestätigung_Mit Test nach Erscheinungsbild des Feldnamens sortieren)
for item in sorted(result.items(),
		key=lambda field: keys_test.index(field[0])):
	print(item)

Ausführungsergebnis:

Terminal


('Kurzbezeichnung', 'England')
('Japanischer Ländername', 'Vereinigtes Königreich Großbritannien und Nordirland')
('Offizieller Ländername', 'Vereinigtes Königreich Großbritannien und Nordirland Offizieller Ländername in nicht englischer Sprache:\n*Ein Rìoghachd Aonaichte na Breatainn Mhòr agus Eirinn mu Thuath (schottisch-gälisch)\n*Teyrnas Gyfunol Prydain Fawr und Gogledd Iwerddon (Wale)\n*Ríocht Aontai the na Breataine Móire agus Tuaisceart na hÉireann (irisch)\n*Ein Rywvaneth Unys ein Vreten Veur hag Iwerdhon Glédh (Cornwall)\n*Unitit Kinrick o Großer Breetain und Nordirland (schottisch)\n**Claught Kängrick o Docht Brätain und Norlin Airlann, Unitet Kängdom o Great Brittain und Norlin Airlann (Alster Scottish)')
('Flaggenbild', 'Flag of the United Kingdom.svg')
('Nationales Emblembild', 'Britisches nationales Emblem')
('Nationaler Emblem-Link', '(Staatswappen)')
('Slogan', 'Dieu et mon droit (französisch):Gott und meine Rechte)')
('Nationalhymne', 'Beschütze deine Majestät die Königin, Gott')
('Positionieren Sie das Bild', 'Location_UK_EU_Europe_001.svg')
('Offizielle Terminologie', 'Englisch (virtuell)')
('Hauptstadt', 'London')
('Größte Stadt', 'London')
('Ehemaliger Haupttitel', 'Königin')
('Vorname', 'Elizabeth II')
('Titel des Premierministers', 'Premierminister')
('Name des Premierministers', 'David Cameron')
('Gebietsrangliste', '76')
('Flächengröße', '1 E11')
('Flächenwert', '244,820')
('Wasserflächenverhältnis', '1.3%')
('Jahr der Volkszählung', '2011')
('Bevölkerungsranking', '22')
('Einwohnerzahl', '1 E7')
('Bevölkerungswert', '63,181,775United Nations Department of Economic and Social Affairs>Population Division>Data>Population>Total Population')
('Bevölkerungsdichtewert', '246')
('BIP-Statistik Jahr Yuan', '2012')
('BIP-Wertquelle', '1.547,8 Milliarden IWF>Data and Statistics>World Economic Outlook Databases>By Countrise>United Kingdom')
('BIP-Statistik Jahr MER', '2012')
('BIP-Ranking MER', '5')
('BIP-Wert MER', '2.433,7 Milliarden')
('Statistisches BIP-Jahr', '2012')
('BIP-Ranking', '6')
('BIP-Wert', '2.316,2 Milliarden')
('GDP/Mann', '36,727')
('Gründungsform', 'Gründung des Landes')
('Etablierte Form 1', 'Königreich England / Königreich Schottland (beide Länder bis zum Union Act von 1707)')
('Gründungsdatum 1', '927/843')
('Etablierte Form 2', 'Gründung des Königreichs Großbritannien (Union Act 1707)')
('Gründungsdatum 2', '1707')
('Etablierte Form 3', 'Gründung des Vereinigten Königreichs Großbritannien und Irland (Union Act 1800)')
('Gründungsdatum 3', '1801')
('Etablierte Form 4', 'Geändert in den aktuellen Ländernamen "Großbritannien und das Vereinigte Königreich Nordirland"')
('Gründungsdatum 4', '1927')
('Währung', 'UK Pfund(&pound;)')
('Währungscode', 'GBP')
('Zeitzone', '±0')
('Sommerzeit', '+1')
('ISO 3166-1', 'GB / GBR')
('ccTLD', '.uk / .gb verwenden.Überwiegend kleine Zahl im Vergleich zu Großbritannien.')
('Internationale Telefonnummer', '44')
('Hinweis', '')

Datei entfernen

[Vorherige Frage] remove_markup () von (http://qiita.com/segavvy/items/9a8137f045852bc299d6) wurde repariert. Wenn Sie den internen Link in der vorherigen Frage entfernen, sollte die Datei nicht beteiligt sein, indem Sie festlegen, dass nur 0 oder 1 "|" in dem von "[[" und "]" eingeschlossenen Bereich angezeigt wird. Dieses Mal wird die Datei jedoch durch das Targeting von zwei oder mehr gleichzeitig mit dem internen Link entfernt.

Entfernen von Template: Lang

Template:LangWenn Sie anschauen{{lang|Sprach-Tag|String}}Es scheint im Format zu sein, also das hierStringIch versuchte zu gehen.

Entfernen von externen Links

Wenn Sie sich den "externen Link" in der [Markup-Kurzreferenztabelle](https://ja.wikipedia.org/wiki/Help: Schnellreferenztabelle) ansehen, wird es sein, wenn "[http://www.example.org Anzeigezeichen]" Scheint eine "Anzeigezeichenfolge" hinterlassen zu müssen, also habe ich das versucht.

Entfernen anderer Markups

Das Problem besteht darin, das "MediaWiki-Markup so weit wie möglich" zu entfernen. Wenn man sich jedoch die bisherigen Entfernungsergebnisse ansieht, scheint es, dass nur noch "
" und "" übrig sind. Entfernen Sie also diese beiden. Ich mache es.

Das ist alles für den 29. Schlag. Wenn Sie Fehler haben, würde ich mich freuen, wenn Sie darauf hinweisen könnten.


Recommended Posts

100 Amateur-Sprachverarbeitungsklopfen: 41
100 Amateur-Sprachverarbeitungsklopfen: 56
100 Amateur-Sprachverarbeitungsklopfen: 24
100 Amateur-Sprachverarbeitungsklopfen: 50
100 Amateur-Sprachverarbeitungsklopfen: 59
100 Amateur-Sprachverarbeitungsklopfen: 70
100 Amateur-Sprachverarbeitungsklopfen: 62
100 Amateur-Sprachverarbeitungsklopfen: 92
100 Amateur-Sprachverarbeitungsklopfen: 06
100 Amateur-Sprachverarbeitungsklopfen: 81
100 Amateur-Sprachverarbeitungsklopfen: 46
100 Amateur-Sprachverarbeitungsklopfen: 88
100 Amateur-Sprachverarbeitungsklopfen: 89
100 Amateur-Sprachverarbeitungsklopfen: 43
100 Amateur-Sprachverarbeitungsklopfen: 55
100 Amateur-Sprachverarbeitungsklopfen: 94
100 Amateur-Sprachverarbeitungsklopfen: 54
100 Amateur-Sprachverarbeitungsklopfen: 63
100 Amateur-Sprachverarbeitungsklopfen: 78
100 Amateur-Sprachverarbeitungsklopfen: 12
100 Amateur-Sprachverarbeitungsklopfen: 14
100 Amateur-Sprachverarbeitungsklopfen: 08
100 Amateur-Sprachverarbeitungsklopfen: 42
100 Amateur-Sprachverarbeitungsklopfen: 73
100 Amateur-Sprachverarbeitungsklopfen: 75
100 Amateur-Sprachverarbeitungsklopfen: 98
100 Amateur-Sprachverarbeitungsklopfen: 83
100 Amateur-Sprachverarbeitungsklopfen: 95
100 Amateur-Sprachverarbeitungsklopfen: 32
100 Amateur-Sprachverarbeitungsklopfen: 96
100 Amateur-Sprachverarbeitungsklopfen: 87
100 Amateur-Sprachverarbeitungsklopfen: 72
100 Amateur-Sprachverarbeitungsklopfen: 79
100 Amateur-Sprachverarbeitungsklopfen: 05
100 Amateur-Sprachverarbeitungsklopfen: 00
100 Amateur-Sprachverarbeitungsklopfen: 37
100 Amateur-Sprachverarbeitungsklopfen: 21
100 Amateur-Sprachverarbeitungsklopfen: 68
100 Amateur-Sprachverarbeitungsklopfen: 11
100 Amateur-Sprachverarbeitungsklopfen: 90
100 Amateur-Sprachverarbeitungsklopfen: 74
100 Amateur-Sprachverarbeitungsklopfen: 66
100 Amateur-Sprachverarbeitungsklopfen: 28
100 Amateur-Sprachverarbeitungsklopfen: 64
100 Amateur-Sprachverarbeitungsklopfen: 34
100 Amateur-Sprachverarbeitungsklopfen: 36
100 Amateur-Sprachverarbeitungsklopfen: 77
100 Amateur-Sprachverarbeitungsklopfen: 01
100 Amateur-Sprachverarbeitungsklopfen: 16
100 Amateur-Sprachverarbeitungsklopfen: 27
100 Amateur-Sprachverarbeitungsklopfen: 10
100 Amateur-Sprachverarbeitungsklopfen: 03
100 Amateur-Sprachverarbeitungsklopfen: 82
100 Amateur-Sprachverarbeitungsklopfen: 69
100 Amateur-Sprachverarbeitungsklopfen: 53
100 Amateur-Sprachverarbeitungsklopfen: 18
100 Amateur-Sprachverarbeitungsklopfen: 35
100 Amateur-Sprachverarbeitungsklopfen: 91
100 Amateur-Sprachverarbeitungsklopfen: 15
100 Amateur-Sprachverarbeitungsklopfen: 38
100 Amateur-Sprachverarbeitungsklopfen: 86