"""
27.Suppression des liens internes
En plus des 26 processus, supprimez le balisage du lien interne MediaWiki de la valeur du modèle et convertissez-le en texte (référence):Tableau de majoration).
"""
import json
import re
import utils
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"]
def get_basic_info(string: str) -> str:
"""Get basic information section
"""
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
^\}\}$ # '}}'Lignes se terminant par
""",
re.MULTILINE | re.DOTALL | re.VERBOSE,
)
return re.findall(pattern, string)[0]
def get_content(string: str) -> list:
r"""
https://docs.python.org/3/library/re.html#regular-expression-syntax
RE:
- re.X (re.VERBOSE) Allow us add command to explain the regular expression
- re.M (re.MULTILINE) Apply match to each line. If not specified, only match the first line.
- re.S (re.DOTALL) Allow to recognize '\n'
- ^\| String begin with |
- ? 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>'
- (...) Matches whatever regular expression is inside the parentheses,
- (?=...) Matches if ... matches next, but doesn’t consume any of the string. This is called a lookahead assertion.
For example, Isaac (?=Asimov) will match 'Isaac ' only if it’s followed by 'Asimov'.
- (?:...) A non-capturing version of regular parentheses.
Input:
- '|Lien de l'emblème national=([[Emblème national britannique|emblème national]])'
Return:
- {'Lien de l'emblème national': '([[Emblème national britannique|emblème national]])'}
"""
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)
| #Ou
(?=\n$) #nouvelle ligne+Avant la fin (anticipation affirmative)
) #Fin du groupe
""",
re.MULTILINE | re.DOTALL | re.VERBOSE,
)
result = re.findall(pattern, string)
return {k: v for k, v in result} # dict is ordered when using python 3.7
def remove_markup(target: str) -> str:
# ans26
# Remvoe highlight markup
#Utilisation de la "Grande-Bretagne" pour remplacer "'''Grande Bretagne'''」
pattern1 = 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 = re.sub(pattern1, r"\2", target)
# and27
# Remove link markup
"""
[[Londres]] -> Londres
[[Premier ministre britannique|premier ministre]] -> premier ministre
[[Fichier:Royal Coat of Arms of the United Kingdom.svg|85px|Emblème national britannique]] -> Emblème national britannique
[] -> Used to indicate a set of characters. [(+*)] will match any of the literal characters '(', '+', '*', or ')'.
"""
pattern2 = 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
\| # '|'
)*? #Le groupe est égal ou supérieur à 0, 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 = re.sub(pattern2, r"\1", target)
return target
# and20
uk_text = get_uk_text("jawiki-country.json") # See uk_text.txt
# ans25
basic_info = get_basic_info(uk_text)
fields = get_content(basic_info) # See 25_en_basic_info.json
# ans26, and27
result = {k: remove_markup(v) for k, v in fields.items()} # See 26_no_markup.json
# "Image de l'emblème national": "[[Fichier:Royal Coat of Arms of the United Kingdom.svg|85px|Emblème national britannique]]",
print(result["Image de l'emblème national"])
utils.save_json(result, "27_no_link.json")
# Test for 27
data = [
("[[Londres]]", "Londres"),
("[[Premier ministre britannique|premier ministre]]", "premier ministre"),
("[[Fichier:Royal Coat of Arms of the United Kingdom.svg|85px|Emblème national britannique]]", "Emblème national britannique"),
(
"{{lang|fr|[[Dieu et mon droit]]}}<br />([[français]]:[[Dieu et mon droit|Dieu et mes droits]])",
"{{lang|fr|Dieu et mon droit}}<br />(Français:Dieu et mes droits)",
),
]
pattern2 = 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
\| # '|'
)*? #Le groupe est égal ou supérieur à 0, 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,
)
for target, answer in data:
assert answer == re.sub(pattern2, r"\1", target)
Recommended Posts