"""
22.Extraktion des Kategorienamens
Extrahieren Sie die Namen der Artikelkategorien (nach Namen, nicht nach Zeile).
"""
import json
import re
def get_uk_text(path):
with open(path) as f:
for line in f:
line_data = json.loads(line)
if line_data["title"] == "England":
data = line_data
break
return data["text"]
uk_text = get_uk_text("jawiki-country.json")
uk_text_list = uk_text.split("\n")
ans = [x for x in uk_text_list if "Category:" in x[:11]]
# ans:
# [[Category:Vereinigte Königreich Mitgliedsländer]]
# [[Category:Königreich des Vereinigten Königreichs|*]]
# [[Category:G8-Mitgliedsländer]]
# [[Category:Mitgliedsländer der Europäischen Union|Ehemalige]]
# [[Category:Marine Nation]]
# [[Category:Bestehendes souveränes Land]]
# [[Category:Inselstaat]]
# [[Category:Eine Nation / ein Gebiet, das 1801 gegründet wurde]]
# ans22
def extract_category_value(string: str) -> str:
"""
https://docs.python.org/3/library/re.html#regular-expression-syntax
- re.VERBOSE allow us add command to explain the regular expression
- re.S allow to recognize '\n'
- (...) matches whatever regular expression is inside the parentheses,
- (?:...) a non-capturing version of regular parentheses.
- ? causes the resulting RE to match 0 or 1 repetitions
- *? the '*' qualifier is greedy.
Adding ? after the qualifier makes it perform the match in non-greedy or minimal fashion; as few characters as possible will be matched.
e.g. <.*> is matched against '<a> b <c>'
e.g. <.*?> will match only '<a>'
Input: [[Category:England|*]]
Output: 'England'
"""
pattern = re.compile(
r"""
^ #Zeilenanfang
.* #Beliebiges Zeichen 0 oder mehr
\[\[Category:
( #Startgruppe, die erfasst werden soll
.*? #Alle Zeichen 0 oder mehr, nicht gierig übereinstimmen (wenn gierig, die zweite Hälfte'|'Enthält Dekorationen, die mit beginnen)
) #Gruppenende
(?: #Starten Sie eine Gruppe, die nicht erfasst wird
\|.* # '|'Es folgen 0 oder mehr Zeichen
)? #Gruppenende, 0 oder 1 Aussehen
\]\]
.* #Beliebiges Zeichen 0 oder mehr
$ #Ende der Linie
""",
re.VERBOSE | re.S,
)
result = re.findall(pattern, string)[0]
return result
category_values = [extract_category_value(s) for s in ans]
print(category_values)
# ['England',
# 'Vereinigte Königreich Mitgliedsländer',
# 'Königreich des Vereinigten Königreichs',
# 'G8-Mitgliedsländer',
# 'Mitgliedsländer der Europäischen Union',
# 'Marine Nation',
# 'Bestehendes souveränes Land',
# 'Inselstaat',
# 'Eine Nation / ein Gebiet, das 1801 gegründet wurde']
Recommended Posts