"""
22.Extraction du nom de la catégorie
Extrayez les noms des catégories d'articles (par nom et non par ligne).
"""
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"] == "Angleterre":
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:Pays membres du Royaume-Uni]]
# [[Category:Royaume du Royaume-Uni|*]]
# [[Category:Pays membres du G8]]
# [[Category:Pays membres de l'Union européenne|Ancien]]
# [[Category:Nation marine]]
# [[Category:Pays souverain existant]]
# [[Category:Pays insulaire]]
# [[Category:Une nation / territoire créé en 1801]]
# 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:Angleterre|*]]
Output: 'Angleterre'
"""
pattern = re.compile(
r"""
^ #Début de ligne
.* #Tout caractère 0 ou plus
\[\[Category:
( #Démarrer le groupe à capturer
.*? #Tout caractère 0 ou plus, correspondance non gourmande (en cas de gourmandise, la seconde moitié'|'Implique des décorations commençant par)
) #Fin du groupe
(?: #Démarrer un groupe qui n'est pas capturé
\|.* # '|'0 ou plusieurs caractères suivants
)? #Fin de groupe, 0 ou 1 apparition
\]\]
.* #Tout caractère 0 ou plus
$ #Fin de ligne
""",
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)
# ['Angleterre',
# 'Pays membres du Royaume-Uni',
# 'Royaume du Royaume-Uni',
# 'Pays membres du G8',
# 'Pays membres de l'Union européenne',
# 'Nation marine',
# 'Pays souverain existant',
# 'Pays insulaire',
# 'Une nation / territoire créé en 1801']
Recommended Posts