第一次提交
This commit is contained in:
commit
0c77c42add
8
.idea/TxT2DOCX.iml
Normal file
8
.idea/TxT2DOCX.iml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="PYTHON_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$" />
|
||||||
|
<orderEntry type="jdk" jdkName="Python 3.10" jdkType="Python SDK" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
||||||
1635
Txt2docx2.py
Normal file
1635
Txt2docx2.py
Normal file
File diff suppressed because it is too large
Load Diff
116
data/error_chars.json
Normal file
116
data/error_chars.json
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
{
|
||||||
|
"日": "曰",
|
||||||
|
"木": "本",
|
||||||
|
"度": "渡",
|
||||||
|
"暴": "爆",
|
||||||
|
"籍": "藉",
|
||||||
|
"销": "消",
|
||||||
|
"璧": "壁",
|
||||||
|
"讴": "呕",
|
||||||
|
"勠": "戮",
|
||||||
|
"篡": "纂",
|
||||||
|
"需": "须",
|
||||||
|
"迄": "讫",
|
||||||
|
"磬": "罄",
|
||||||
|
"驰": "弛",
|
||||||
|
"拨": "拔",
|
||||||
|
"朴": "扑",
|
||||||
|
"沾": "粘",
|
||||||
|
"戊": "戌",
|
||||||
|
"崇": "祟",
|
||||||
|
"菅": "管",
|
||||||
|
"荼": "茶",
|
||||||
|
"灸": "炙",
|
||||||
|
"钓": "钧",
|
||||||
|
"丐": "丏",
|
||||||
|
"亨": "享",
|
||||||
|
"赢": "羸",
|
||||||
|
"肓": "盲",
|
||||||
|
"赝": "膺",
|
||||||
|
"掣": "擎",
|
||||||
|
"峰": "锋",
|
||||||
|
"读": "续",
|
||||||
|
"眯": "咪",
|
||||||
|
"胶": "狡",
|
||||||
|
"旯": "旮",
|
||||||
|
"奄": "掩",
|
||||||
|
"恃": "持",
|
||||||
|
"径": "胫",
|
||||||
|
"坝": "狈",
|
||||||
|
"幅": "副",
|
||||||
|
"颗": "棵",
|
||||||
|
"即": "既",
|
||||||
|
"俩": "两",
|
||||||
|
"辨": "辩",
|
||||||
|
"树立": "竖立",
|
||||||
|
"其他": "其它",
|
||||||
|
"截止": "截至",
|
||||||
|
"考查": "考察",
|
||||||
|
"治服": "制服",
|
||||||
|
"权利": "权力",
|
||||||
|
"申明": "声明",
|
||||||
|
"交代": "交待",
|
||||||
|
"含义": "涵义",
|
||||||
|
"安": "按",
|
||||||
|
"曝": "暴",
|
||||||
|
"博": "搏",
|
||||||
|
"灿": "粲",
|
||||||
|
"毫": "豪",
|
||||||
|
"检": "捡",
|
||||||
|
"骄": "娇",
|
||||||
|
"梁": "粱",
|
||||||
|
"蓬": "篷",
|
||||||
|
"辟": "僻",
|
||||||
|
"欺": "期",
|
||||||
|
"洽": "恰",
|
||||||
|
|
||||||
|
"皱": "邹",
|
||||||
|
"诸": "著",
|
||||||
|
"煮": "著",
|
||||||
|
"壮": "状",
|
||||||
|
"追": "摧",
|
||||||
|
"卓": "桌",
|
||||||
|
"咨": "资",
|
||||||
|
"滋": "磁",
|
||||||
|
"阻": "组",
|
||||||
|
"遵": "尊",
|
||||||
|
"的": "得",
|
||||||
|
"她": "他",
|
||||||
|
"到": "倒",
|
||||||
|
"倒": "到",
|
||||||
|
"要": "耍",
|
||||||
|
"说": "讲",
|
||||||
|
"讲": "说",
|
||||||
|
"做": "作",
|
||||||
|
"作": "做",
|
||||||
|
"已": "已",
|
||||||
|
"己": "已",
|
||||||
|
"以": "已",
|
||||||
|
"进": "近",
|
||||||
|
"近": "进",
|
||||||
|
"象": "像",
|
||||||
|
"像": "象",
|
||||||
|
"茶": "荼",
|
||||||
|
"孑": "孓",
|
||||||
|
"子": "孑",
|
||||||
|
"雎": "睢",
|
||||||
|
"汆": "氽",
|
||||||
|
"戍": "戌",
|
||||||
|
"妹": "妺",
|
||||||
|
"口": "囗",
|
||||||
|
"姬": "姫",
|
||||||
|
"祎": "袆",
|
||||||
|
"亳": "毫",
|
||||||
|
"汩": "汨",
|
||||||
|
"市": "巿",
|
||||||
|
"壸": "壶",
|
||||||
|
"祒": "袑",
|
||||||
|
"洗": "冼",
|
||||||
|
"夂": "夊",
|
||||||
|
"祖": "袓",
|
||||||
|
"芙": "褔",
|
||||||
|
"萬": "萭"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
473
replacestr.py
Normal file
473
replacestr.py
Normal file
@ -0,0 +1,473 @@
|
|||||||
|
import re
|
||||||
|
import random
|
||||||
|
import argparse
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
from typing import List, Tuple, Optional, Dict, Any
|
||||||
|
from pathlib import Path
|
||||||
|
import logging
|
||||||
|
|
||||||
|
|
||||||
|
class TextProcessor:
|
||||||
|
"""文本处理器类,支持句子拆分和字符交换"""
|
||||||
|
|
||||||
|
def __init__(self, min_length: int = 30, custom_punctuation: Optional[str] = None):
|
||||||
|
"""
|
||||||
|
初始化文本处理器
|
||||||
|
|
||||||
|
Args:
|
||||||
|
min_length: 句子长度阈值
|
||||||
|
custom_punctuation: 自定义标点符号,如果为None则使用默认标点
|
||||||
|
"""
|
||||||
|
self.min_length = min_length
|
||||||
|
self.sentence_endings = custom_punctuation or r'[,。!?;?!;]'
|
||||||
|
self.statistics = {
|
||||||
|
'total_sentences': 0,
|
||||||
|
'processed_sentences': 0,
|
||||||
|
'total_chars': 0,
|
||||||
|
'swapped_chars': 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# 设置日志
|
||||||
|
logging.basicConfig(level=logging.INFO,
|
||||||
|
format='%(asctime)s - %(levelname)s - %(message)s')
|
||||||
|
self.logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
def split_sentences(self, text: str) -> List[Tuple[str, str]]:
|
||||||
|
"""
|
||||||
|
按标点符号拆分句子,保留标点符号
|
||||||
|
|
||||||
|
Args:
|
||||||
|
text: 输入文本
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
List[Tuple[str, str]]: 每个元组包含 (句子内容, 标点符号)
|
||||||
|
"""
|
||||||
|
if not text.strip():
|
||||||
|
return []
|
||||||
|
|
||||||
|
# 使用正则表达式拆分,保留分隔符
|
||||||
|
parts = re.split(f'({self.sentence_endings})', text)
|
||||||
|
|
||||||
|
sentences = []
|
||||||
|
i = 0
|
||||||
|
while i < len(parts):
|
||||||
|
content = parts[i].strip()
|
||||||
|
if content: # 非空内容
|
||||||
|
# 检查下一个部分是否是标点符号
|
||||||
|
if i + 1 < len(parts) and re.match(self.sentence_endings, parts[i + 1]):
|
||||||
|
punctuation = parts[i + 1]
|
||||||
|
i += 2
|
||||||
|
else:
|
||||||
|
punctuation = ''
|
||||||
|
i += 1
|
||||||
|
sentences.append((content, punctuation))
|
||||||
|
self.statistics['total_sentences'] += 1
|
||||||
|
else:
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
return sentences
|
||||||
|
|
||||||
|
def swap_random_chars(self, sentence: str) -> str:
|
||||||
|
"""
|
||||||
|
对超长句子随机交换相邻两个字符的顺序
|
||||||
|
|
||||||
|
Args:
|
||||||
|
sentence: 输入句子
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: 处理后的句子
|
||||||
|
"""
|
||||||
|
# 边界情况处理
|
||||||
|
if not sentence or len(sentence) <= self.min_length or len(sentence) <= 3:
|
||||||
|
return sentence
|
||||||
|
|
||||||
|
# 转换为字符列表便于操作
|
||||||
|
chars = list(sentence)
|
||||||
|
original_length = len(chars)
|
||||||
|
|
||||||
|
# 确定可交换的范围(避开首尾字符,且需要成对相邻)
|
||||||
|
# 对于长度为n的句子,可交换的相邻对位置为:(1,2), (2,3), ..., (n-3,n-2)
|
||||||
|
start_idx = 1
|
||||||
|
end_idx = len(chars) - 3 # 最后一个可交换对的起始位置
|
||||||
|
|
||||||
|
if end_idx < start_idx:
|
||||||
|
return sentence
|
||||||
|
|
||||||
|
try:
|
||||||
|
# 随机选择一个相邻对的起始位置
|
||||||
|
swap_start = random.randint(start_idx, end_idx)
|
||||||
|
swap_end = swap_start + 1
|
||||||
|
|
||||||
|
# 交换相邻的两个字符
|
||||||
|
chars[swap_start], chars[swap_end] = chars[swap_end], chars[swap_start]
|
||||||
|
|
||||||
|
# 更新统计信息
|
||||||
|
self.statistics['processed_sentences'] += 1
|
||||||
|
self.statistics['swapped_chars'] += 2
|
||||||
|
|
||||||
|
self.logger.debug(f"交换相邻位置 {swap_start} 和 {swap_end},句子长度:{original_length}")
|
||||||
|
|
||||||
|
except (ValueError, IndexError) as e:
|
||||||
|
self.logger.warning(f"字符交换失败:{e}")
|
||||||
|
return sentence
|
||||||
|
|
||||||
|
return ''.join(chars)
|
||||||
|
|
||||||
|
def process_text(self, text: str) -> str:
|
||||||
|
"""
|
||||||
|
处理文本:拆分句子并对超长句子进行字符交换
|
||||||
|
|
||||||
|
Args:
|
||||||
|
text: 输入文本
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: 处理后的文本
|
||||||
|
"""
|
||||||
|
if not text:
|
||||||
|
return text
|
||||||
|
|
||||||
|
# 重置统计信息
|
||||||
|
self.statistics = {
|
||||||
|
'total_sentences': 0,
|
||||||
|
'processed_sentences': 0,
|
||||||
|
'total_chars': len(text),
|
||||||
|
'swapped_chars': 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# 按段落分割
|
||||||
|
paragraphs = text.split('\n')
|
||||||
|
processed_paragraphs = []
|
||||||
|
|
||||||
|
for paragraph in paragraphs:
|
||||||
|
if not paragraph.strip():
|
||||||
|
processed_paragraphs.append(paragraph)
|
||||||
|
continue
|
||||||
|
|
||||||
|
# 拆分句子
|
||||||
|
sentences = self.split_sentences(paragraph)
|
||||||
|
|
||||||
|
# 处理每个句子
|
||||||
|
processed_sentences = []
|
||||||
|
for sentence_content, punctuation in sentences:
|
||||||
|
# 对句子内容进行字符交换
|
||||||
|
processed_content = self.swap_random_chars(sentence_content)
|
||||||
|
processed_sentences.append(processed_content + punctuation)
|
||||||
|
|
||||||
|
# 重新组合句子
|
||||||
|
processed_paragraph = ''.join(processed_sentences)
|
||||||
|
processed_paragraphs.append(processed_paragraph)
|
||||||
|
|
||||||
|
return '\n'.join(processed_paragraphs)
|
||||||
|
|
||||||
|
def get_statistics(self) -> Dict[str, Any]:
|
||||||
|
"""获取处理统计信息"""
|
||||||
|
return self.statistics.copy()
|
||||||
|
|
||||||
|
def print_statistics(self):
|
||||||
|
"""打印处理统计信息"""
|
||||||
|
stats = self.get_statistics()
|
||||||
|
print("\n" + "=" * 50)
|
||||||
|
print("处理统计信息:")
|
||||||
|
print(f"总字符数:{stats['total_chars']}")
|
||||||
|
print(f"总句子数:{stats['total_sentences']}")
|
||||||
|
print(f"处理句子数:{stats['processed_sentences']}")
|
||||||
|
print(f"交换字符数:{stats['swapped_chars']}")
|
||||||
|
if stats['total_sentences'] > 0:
|
||||||
|
print(f"处理率:{stats['processed_sentences'] / stats['total_sentences'] * 100:.1f}%")
|
||||||
|
print("=" * 50)
|
||||||
|
|
||||||
|
|
||||||
|
class FileHandler:
|
||||||
|
"""文件处理器,负责文件的读写操作"""
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def read_file(filename: str) -> str:
|
||||||
|
"""
|
||||||
|
读取文件内容,支持多种编码
|
||||||
|
|
||||||
|
Args:
|
||||||
|
filename: 文件路径
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: 文件内容
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
FileNotFoundError: 文件不存在
|
||||||
|
PermissionError: 权限不足
|
||||||
|
UnicodeDecodeError: 编码错误
|
||||||
|
"""
|
||||||
|
if not os.path.exists(filename):
|
||||||
|
raise FileNotFoundError(f"文件 '{filename}' 不存在")
|
||||||
|
|
||||||
|
if not os.access(filename, os.R_OK):
|
||||||
|
raise PermissionError(f"没有读取文件 '{filename}' 的权限")
|
||||||
|
|
||||||
|
# 尝试多种编码格式
|
||||||
|
encodings = ['utf-8', 'gbk', 'gb2312', 'latin-1']
|
||||||
|
|
||||||
|
for encoding in encodings:
|
||||||
|
try:
|
||||||
|
with open(filename, 'r', encoding=encoding) as f:
|
||||||
|
content = f.read()
|
||||||
|
logging.info(f"使用 {encoding} 编码成功读取文件:{filename}")
|
||||||
|
return content
|
||||||
|
except UnicodeDecodeError:
|
||||||
|
continue
|
||||||
|
|
||||||
|
raise UnicodeDecodeError(f"无法解码文件 '{filename}',尝试的编码格式:{encodings}")
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def write_file(filename: str, content: str, encoding: str = 'utf-8') -> None:
|
||||||
|
"""
|
||||||
|
写入文件内容
|
||||||
|
|
||||||
|
Args:
|
||||||
|
filename: 输出文件路径
|
||||||
|
content: 要写入的内容
|
||||||
|
encoding: 编码格式
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
PermissionError: 权限不足
|
||||||
|
OSError: 磁盘空间不足等系统错误
|
||||||
|
"""
|
||||||
|
# 确保目录存在
|
||||||
|
output_dir = os.path.dirname(filename)
|
||||||
|
if output_dir and not os.path.exists(output_dir):
|
||||||
|
os.makedirs(output_dir, exist_ok=True)
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open(filename, 'w', encoding=encoding) as f:
|
||||||
|
f.write(content)
|
||||||
|
logging.info(f"成功写入文件:{filename}")
|
||||||
|
except PermissionError:
|
||||||
|
raise PermissionError(f"没有写入文件 '{filename}' 的权限")
|
||||||
|
except OSError as e:
|
||||||
|
raise OSError(f"写入文件 '{filename}' 时发生错误:{e}")
|
||||||
|
|
||||||
|
|
||||||
|
def setup_argument_parser() -> argparse.ArgumentParser:
|
||||||
|
"""设置命令行参数解析器"""
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description='文本句子字符交换处理器',
|
||||||
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||||
|
epilog="""
|
||||||
|
使用示例:
|
||||||
|
%(prog)s -f input.txt # 处理文件
|
||||||
|
%(prog)s -t "你的文本内容" # 直接处理文本
|
||||||
|
%(prog)s -f input.txt -l 20 # 设置长度阈值为20
|
||||||
|
%(prog)s -f input.txt -o output.txt # 输出到文件
|
||||||
|
%(prog)s -f input.txt -p "。!?" -s # 自定义标点符号并显示统计
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
# 输入选项
|
||||||
|
input_group = parser.add_mutually_exclusive_group(required=True)
|
||||||
|
input_group.add_argument('-f', '--file', help='输入文件路径')
|
||||||
|
input_group.add_argument('-t', '--text', help='直接输入文本')
|
||||||
|
input_group.add_argument('--stdin', action='store_true',
|
||||||
|
help='从标准输入读取文本')
|
||||||
|
|
||||||
|
# 处理选项
|
||||||
|
parser.add_argument('-l', '--length', type=int, default=30,
|
||||||
|
help='句子长度阈值(默认30)')
|
||||||
|
parser.add_argument('-p', '--punctuation',
|
||||||
|
help='自定义标点符号(默认:。!?;?!;)')
|
||||||
|
parser.add_argument('-o', '--output', help='输出文件路径')
|
||||||
|
parser.add_argument('-e', '--encoding', default='utf-8',
|
||||||
|
help='输出文件编码(默认utf-8)')
|
||||||
|
|
||||||
|
# 其他选项
|
||||||
|
parser.add_argument('-s', '--statistics', action='store_true',
|
||||||
|
help='显示处理统计信息')
|
||||||
|
parser.add_argument('-v', '--verbose', action='store_true',
|
||||||
|
help='显示详细日志')
|
||||||
|
parser.add_argument('--seed', type=int, help='随机数种子(用于测试)')
|
||||||
|
|
||||||
|
return parser
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""主函数:处理命令行参数和文本处理"""
|
||||||
|
parser = setup_argument_parser()
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
# 设置日志级别
|
||||||
|
if args.verbose:
|
||||||
|
logging.getLogger().setLevel(logging.DEBUG)
|
||||||
|
|
||||||
|
# 设置随机数种子(用于测试)
|
||||||
|
if args.seed:
|
||||||
|
random.seed(args.seed)
|
||||||
|
|
||||||
|
# 获取输入文本
|
||||||
|
try:
|
||||||
|
if args.file:
|
||||||
|
text = FileHandler.read_file(args.file)
|
||||||
|
elif args.text:
|
||||||
|
text = args.text
|
||||||
|
elif args.stdin:
|
||||||
|
text = sys.stdin.read()
|
||||||
|
else:
|
||||||
|
print("错误:请指定输入源")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
if not text.strip():
|
||||||
|
print("警告:输入文本为空")
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
except (FileNotFoundError, PermissionError, UnicodeDecodeError) as e:
|
||||||
|
print(f"错误:{e}")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
# 创建处理器并处理文本
|
||||||
|
try:
|
||||||
|
processor = TextProcessor(
|
||||||
|
min_length=args.length,
|
||||||
|
custom_punctuation=args.punctuation
|
||||||
|
)
|
||||||
|
|
||||||
|
processed_text = processor.process_text(text)
|
||||||
|
|
||||||
|
# 输出结果
|
||||||
|
if args.output:
|
||||||
|
FileHandler.write_file(args.output, processed_text, args.encoding)
|
||||||
|
print(f"处理完成,结果已保存到 '{args.output}'")
|
||||||
|
else:
|
||||||
|
print("处理结果:")
|
||||||
|
print("-" * 50)
|
||||||
|
print(processed_text)
|
||||||
|
|
||||||
|
# 显示统计信息
|
||||||
|
if args.statistics:
|
||||||
|
processor.print_statistics()
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"处理过程中发生错误:{e}")
|
||||||
|
if args.verbose:
|
||||||
|
import traceback
|
||||||
|
traceback.print_exc()
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
# 单元测试
|
||||||
|
def run_tests():
|
||||||
|
"""运行基本的单元测试"""
|
||||||
|
print("运行单元测试...")
|
||||||
|
|
||||||
|
# 测试句子拆分
|
||||||
|
processor = TextProcessor(min_length=6)
|
||||||
|
|
||||||
|
# 测试1:普通句子拆分
|
||||||
|
test_text = "这是第一句。这是第二句!第三句?"
|
||||||
|
sentences = processor.split_sentences(test_text)
|
||||||
|
assert len(sentences) == 3, f"期望3个句子,实际{len(sentences)}个"
|
||||||
|
assert sentences[0] == ("这是第一句", "。"), f"第一句解析错误:{sentences[0]}"
|
||||||
|
|
||||||
|
# 测试2:相邻字符交换
|
||||||
|
long_sentence = "这是一个很长的句子用来测试字符交换功能"
|
||||||
|
random.seed(42) # 固定种子以便测试
|
||||||
|
result = processor.swap_random_chars(long_sentence)
|
||||||
|
assert result != long_sentence, "长句子应该被修改"
|
||||||
|
assert len(result) == len(long_sentence), "交换后长度应该不变"
|
||||||
|
|
||||||
|
# 验证只交换了相邻的两个字符
|
||||||
|
diff_count = sum(1 for i, (a, b) in enumerate(zip(long_sentence, result)) if a != b)
|
||||||
|
assert diff_count == 2, f"应该只有2个字符位置发生变化,实际{diff_count}个"
|
||||||
|
|
||||||
|
# 测试3:短句子不变
|
||||||
|
short_sentence = "短句"
|
||||||
|
result = processor.swap_random_chars(short_sentence)
|
||||||
|
assert result == short_sentence, "短句子不应该被修改"
|
||||||
|
|
||||||
|
# 测试4:边界情况
|
||||||
|
empty_result = processor.swap_random_chars("")
|
||||||
|
assert empty_result == "", "空字符串应该保持不变"
|
||||||
|
|
||||||
|
print("✓ 所有测试通过!")
|
||||||
|
|
||||||
|
|
||||||
|
# 示例使用
|
||||||
|
def replace_text(text):
|
||||||
|
# 检查是否运行测试
|
||||||
|
if len(sys.argv) > 1 and sys.argv[1] == 'test':
|
||||||
|
run_tests()
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
# 命令行模式
|
||||||
|
if len(sys.argv) > 1:
|
||||||
|
main()
|
||||||
|
else:
|
||||||
|
# 示例演示
|
||||||
|
sample_text = text
|
||||||
|
|
||||||
|
print("示例演示:")
|
||||||
|
print("原文:")
|
||||||
|
print(sample_text)
|
||||||
|
print("\n" + "=" * 50 + "\n")
|
||||||
|
min_length = 12
|
||||||
|
processor = TextProcessor(min_length)
|
||||||
|
processed = processor.process_text(sample_text)
|
||||||
|
print("处理后:")
|
||||||
|
print(processed)
|
||||||
|
|
||||||
|
processor.print_statistics()
|
||||||
|
|
||||||
|
|
||||||
|
print("\n使用说明:")
|
||||||
|
print("命令行用法:")
|
||||||
|
print(" python script.py -f input.txt # 处理文件")
|
||||||
|
print(" python script.py -t '你的文本内容' # 直接处理文本")
|
||||||
|
print(" python script.py -f input.txt -l 20 # 设置长度阈值为20")
|
||||||
|
print(" python script.py -f input.txt -o output.txt # 输出到文件")
|
||||||
|
print(" python script.py -f input.txt -p '。!?' -s # 自定义标点符号并显示统计")
|
||||||
|
print(" python script.py test # 运行单元测试")
|
||||||
|
|
||||||
|
return processed
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
text = """阅读此文之前,麻烦您点击一下“关注”,既方便您进行讨论和分享,又能给您带来不一样的参与感,创作不易,感谢您的支持。
|
||||||
|
|
||||||
|
曾经“半路出家”,如今黯然无声,他的故事值得一品
|
||||||
|
说起央视的主持人,大家第一反应肯定是一个个字正腔圆、形象出彩的脸孔。可是在这其中,有一位却用浓厚的潮汕口音,还有点“油滑”的幽默,自成一派。他就是阿丘。
|
||||||
|
|
||||||
|
这个名字,可能在现在已经鲜有人提起,但在过去,他可是实打实的“名嘴”。不过,咱来说点耐人寻味的,他是怎么走到央视巅峰,又怎么“高台跳水”的?这故事,够扎心,更够意味深长。
|
||||||
|
|
||||||
|
看似格格不入,却杀出重围
|
||||||
|
熟悉阿丘的人,一听他那口音,就知道这是“岭南口音模块”的标配。他是个土生土长的广东人,也因为家里是军人家庭,小时候经常搬家,成了个活脱脱的语言天才,学会了好几个地方的方言。什么潮汕话、粤语、客家话,信手拈来。不得不说,小时候到处跑打下的基础,倒给他多了一点和别人不一样的“人味儿”。
|
||||||
|
|
||||||
|
他大学学的专业,可和主持半毛钱关系没有,是经济学。毕业后,他分配到了南宁的棉纺印染厂,待遇不错,是个政工干部。这时候的阿丘,怎么看都是个稳稳的职场小白,可谁能想到,后来的他能走上舞台呢?
|
||||||
|
|
||||||
|
90年代,相声、小品各类幽默比赛风靡全国。阿丘平时最爱的就是琢磨这些妙语段子,一心觉得自己是个“未被发现的宝藏男孩”。机会来了,1992年,他参加广西举办的笑星大赛,居然拿了个一等奖。这下可出名了,厂里人都认识他,他本人也成了“地方笑星”。
|
||||||
|
|
||||||
|
再后来,他调到了广西电视台,开始主持节目。头几年波澜不惊,直到他参加《南北笑星火辣辣》,凭借风趣和机灵吸引了更多目光。2003年,这个来自地方台的主持人,直接杀进了央视主持圈。靠什么?靠他的个性和风格。
|
||||||
|
|
||||||
|
从风光无限到画风突变
|
||||||
|
阿丘进入央视后,主持了好几档节目。他的幽默和接地气,与当时一板一眼的正规主持人大不相同。因此,他迅速被贴上“个性主持”的标签。尤其是在《社会记录》里,那带点潮汕腔调的问句,竟成了一种标志。
|
||||||
|
|
||||||
|
可惜,说话爽快的他,也因为“不当言论”栽了跟头。事情发生在2020年,正是全国上下齐心合力抗击疫情的时候。阿丘不知道怎么回事,在自己的博客里发了一些让人难以接受的言论。里头什么“东亚病夫”“道歉”显得格外刺眼。
|
||||||
|
|
||||||
|
不得不说,这一锅凉水泼得够彻底。网友立刻开始深挖,一挖还真揭出不少黑历史。有人爆料,他婚内包养女大学生,还试图给实习机会。虽然阿丘本人否认得七七八八,但这些传闻和再度破裂的婚姻,难免让人联想。
|
||||||
|
|
||||||
|
面对铺天盖地的指责,阿丘的态度是硬得离谱,一句道歉都没有。“嘴皮子”在这时候完全失灵了。要说在镜头前笑侃万事的大叔,这一次是真没能站住脚。
|
||||||
|
|
||||||
|
离开央视后的低调生活
|
||||||
|
最后,阿丘与央视长达12年的缘分彻底告一段落。此后的日子,他也算是从公众视线中消失了。最让人记得的,是他两年后现身老搭档张泉灵的节目,只是,这一次,他的亮相显得缥缈又散淡。
|
||||||
|
|
||||||
|
如今阿丘的身份,更多转向了自媒体。开了个叫“阿丘观山”的账号,做起旅游文化博主。视频里,他介绍名山大川,什么五台山、武当山,天天讲人生感悟。这画风,和过去主持访谈节目的他,可真是差太远了。
|
||||||
|
|
||||||
|
不少老观众打开他的账号,可能都得感叹一声“物是人非”。更有网友直言,他的语气里听到了些许“悔意”,又觉得是假装云淡风轻,实际还是难以摆脱舆论的阴影。
|
||||||
|
|
||||||
|
留下的启示和争议
|
||||||
|
阿丘的故事,是难得一见的。从地方电视台到央视舞台,他用12年时间登上顶峰,却因为12个字毁了前程。这起伏,真像一出大戏。
|
||||||
|
|
||||||
|
咱们反思一下,也许有些人,天赋、机遇都抓得很精准,但言行失当,永远是会砸场子的导火索。阿丘的人生轨迹,正说明了这一点。
|
||||||
|
|
||||||
|
现在问题来了,大家怎么看阿丘这个人?你是觉得他个性可惜,还是自毁前程?
|
||||||
|
|
||||||
|
欢迎留言讨论,你们的每一次互动,都是创作的动力。"""
|
||||||
|
|
||||||
|
|
||||||
|
result = replace_text(text)
|
||||||
|
print(result)
|
||||||
Loading…
Reference in New Issue
Block a user