Spaces:
Sleeping
Sleeping
| """ | |
| Wiki 文本清洗模块。 | |
| 提供多种过滤器用于清洗 wiki 格式的文本数据。 | |
| """ | |
| import re | |
| def filter_single_line(text: str) -> str | None: | |
| """ | |
| 过滤只有一行的数据(通常是重定向页面)。 | |
| Args: | |
| text: 输入文本 | |
| Returns: | |
| 如果只有一行返回 None,否则返回原文本 | |
| """ | |
| lines = [line for line in text.split("\n") if line.strip()] | |
| if len(lines) <= 1: | |
| return None | |
| return text | |
| def filter_empty_brackets(text: str) -> str: | |
| """ | |
| 移除文本中的空括号对。 | |
| 例如:()、()、( )、( )、[ ]、【 】、{ } 等 | |
| Args: | |
| text: 输入文本 | |
| Returns: | |
| 移除空括号后的文本 | |
| """ | |
| # 匹配空括号对:() () [] 【】 {} 等,中间可有空白 | |
| pattern = re.compile(r"[\(\)()\[\]【】{}]\s*[\(\)()\[\]【】{}]") | |
| return pattern.sub("", text) | |
| def filter_html_tags(text: str) -> str: | |
| """ | |
| 移除 HTML/XML 标签(HTML 实体编码格式)。 | |
| 例如:<templatestyles src="ShareCSS/infobox.css" /> | |
| Args: | |
| text: 输入文本 | |
| Returns: | |
| 移除 HTML 标签后的文本 | |
| """ | |
| # 匹配 <...> 格式的实体编码标签 | |
| pattern = re.compile(r"<[^&]+>") | |
| return pattern.sub("", text) | |
| def filter_lang_tags(text: str) -> str: | |
| """ | |
| 移除特殊的语言标记(支持嵌套)。 | |
| 例如:-{H|zh-hans:重定向;zh-hant:重新导向;}- | |
| 嵌套例如:-{T|zh:-{zh|}-;zh-hans:-{zh-hans|}-;}- | |
| Args: | |
| text: 输入文本 | |
| Returns: | |
| 移除语言转换标记后的文本 | |
| """ | |
| # 使用非贪婪匹配,循环处理嵌套 | |
| pattern = re.compile(r"-\{[^{}]+?}-") | |
| while True: | |
| new_text = pattern.sub("", text) | |
| if new_text == text: # 没有更多匹配了 | |
| break | |
| text = new_text | |
| return text | |
| def clean(text: str) -> str | None: | |
| """ | |
| 应用所有过滤器清洗文本。 | |
| 过滤顺序: | |
| 1. 单行检查(重定向页面) | |
| 2. HTML 标签 | |
| 3. 空白括号行 | |
| 4. 语言转换标记 | |
| 5. 最终空检查 | |
| Args: | |
| text: 输入文本 | |
| Returns: | |
| 清洗后的文本,如果应该丢弃则返回 None | |
| """ | |
| # 1. 检查单行 | |
| result = filter_single_line(text) | |
| if result is None: | |
| return None | |
| # 2. 移除 HTML 标签 | |
| result = filter_html_tags(result) | |
| # 3. 移除空白括号行 | |
| result = filter_empty_brackets(result) | |
| # 4. 移除语言转换标记 | |
| result = filter_lang_tags(result) | |
| # 5. 多个连续空行替换为一个空行 | |
| result = re.sub(r"\n\s*\n", "\n\n", result) | |
| result = result.strip() | |
| # 6. 最终检查:如果结果为空或只剩空白,返回 None | |
| if not result.strip(): | |
| return None | |
| return result | |