word特定文本內(nèi)容字體加粗

將帶序號(hào)的一行內(nèi)容加粗;
將一行中冒號(hào)前面的內(nèi)容加粗。

from docx import Document
import re

def make_text_bold_with_numbering(docx_path):
    """
    將Word文檔中滿足以下條件的文本設(shè)置為粗體:
    1. 每個(gè)冒號(hào)前面同一行的文本內(nèi)容
    2. 以序號(hào)開頭的整行文本(如 1. 2. 3. 等)
    
    Args:
        docx_path (str): Word文檔的路徑
    """
    try:
        # 打開文檔
        doc = Document(docx_path)
        
        # 遍歷所有段落
        for paragraph in doc.paragraphs:
            text = paragraph.text.strip()
            
            if not text:  # 跳過(guò)空段落
                continue
            
            # 檢查是否是序號(hào)開頭的行
            if is_numbered_line(text):
                make_entire_paragraph_bold(paragraph)
            # 檢查是否包含冒號(hào)
            elif ':' in text or ':' in text:
                process_colon_paragraph(paragraph)
        
        # 保存修改后的文檔
        output_path = docx_path.replace('.docx', '_formatted.docx')
        doc.save(output_path)
        print(f"處理完成!修改后的文件已保存為: {output_path}")
        
    except FileNotFoundError:
        print(f"錯(cuò)誤:找不到文件 {docx_path}")
    except Exception as e:
        print(f"處理文件時(shí)發(fā)生錯(cuò)誤:{str(e)}")

def is_numbered_line(text):
    """
    檢查文本是否以序號(hào)開頭
    支持的格式:
    - 1. 2. 3. ... (數(shù)字+點(diǎn))
    - 1) 2) 3) ... (數(shù)字+右括號(hào))
    - (1) (2) (3) ... (括號(hào)+數(shù)字+括號(hào))
    - 一、二、三、... (中文數(shù)字+頓號(hào))
    - 第一章、第二章、... (第+數(shù)字+章節(jié))
    - A. B. C. ... (字母+點(diǎn))
    - I. II. III. ... (羅馬數(shù)字+點(diǎn))
    """
    # 去除開頭的空白字符
    text = text.lstrip()
    
    # 定義各種序號(hào)模式
    patterns = [
        r'^\d+\.',           # 1. 2. 3.
        r'^\d+\)',           # 1) 2) 3)
        r'^\(\d+\)',         # (1) (2) (3)
        r'^[一二三四五六七八九十百千萬(wàn)]+[、。]',  # 一、二、三、
        r'^第[一二三四五六七八九十百千萬(wàn)\d]+[章節(jié)條款項(xiàng)部分]',  # 第一章、第二節(jié)
        r'^[A-Za-z]\.',      # A. B. C. 或 a. b. c.
        r'^[IVXLCDMivxlcdm]+\.',  # I. II. III. 或 i. ii. iii.
        r'^\d+\.\d+',        # 1.1 1.2 2.1 (多級(jí)序號(hào))
        r'^\d+\.\d+\.\d+',   # 1.1.1 1.1.2 (三級(jí)序號(hào))
    ]
    
    # 檢查是否匹配任何序號(hào)模式
    for pattern in patterns:
        if re.match(pattern, text):
            return True
    
    return False

def make_entire_paragraph_bold(paragraph):
    """
    將整個(gè)段落設(shè)置為粗體
    
    Args:
        paragraph: Word文檔的段落對(duì)象
    """
    for run in paragraph.runs:
        run.bold = True

def process_colon_paragraph(paragraph):
    """
    處理包含冒號(hào)的段落,將冒號(hào)前的文本設(shè)置為粗體
    
    Args:
        paragraph: Word文檔的段落對(duì)象
    """
    text = paragraph.text
    
    # 清空段落內(nèi)容
    paragraph.clear()
    
    # 使用正則表達(dá)式處理冒號(hào)前的文本
    # 匹配從行首到冒號(hào)的文本
    pattern = r'([^\n\r]*?)([::])'
    
    last_end = 0
    for match in re.finditer(pattern, text):
        # 添加冒號(hào)前的普通文本(如果有的話)
        before_match = text[last_end:match.start()]
        if before_match:
            paragraph.add_run(before_match)
        
        # 添加冒號(hào)前的文本(粗體)
        text_before_colon = match.group(1)
        
        # 找到這一行的開始位置
        line_start_pos = text.rfind('\n', 0, match.start()) + 1
        actual_text_before_colon = text[line_start_pos:match.start() + len(match.group(1))]
        line_text_before_colon = actual_text_before_colon[actual_text_before_colon.rfind('\n') + 1:]
        
        if line_text_before_colon.strip():
            bold_run = paragraph.add_run(line_text_before_colon)
            bold_run.bold = True
        
        # 添加冒號(hào)
        colon_run = paragraph.add_run(match.group(2))
        
        last_end = match.end()
    
    # 添加剩余文本
    remaining_text = text[last_end:]
    if remaining_text:
        paragraph.add_run(remaining_text)

def enhanced_process_colon_paragraph(paragraph):
    """
    增強(qiáng)版冒號(hào)處理函數(shù) - 更精確地處理冒號(hào)前的文本
    """
    full_text = paragraph.text
    
    # 如果沒(méi)有冒號(hào),直接返回
    if ':' not in full_text and ':' not in full_text:
        return
    
    # 清空段落
    paragraph.clear()
    
    # 按行分割文本
    lines = full_text.split('\n')
    
    for i, line in enumerate(lines):
        if i > 0:  # 添加換行符(除了第一行)
            paragraph.add_run('\n')
        
        # 檢查當(dāng)前行是否包含冒號(hào)
        if ':' in line or ':' in line:
            # 找到第一個(gè)冒號(hào)的位置
            colon_pos_en = line.find(':')
            colon_pos_cn = line.find(':')
            
            if colon_pos_en == -1:
                colon_pos = colon_pos_cn
                colon_char = ':'
            elif colon_pos_cn == -1:
                colon_pos = colon_pos_en
                colon_char = ':'
            else:
                if colon_pos_en < colon_pos_cn:
                    colon_pos = colon_pos_en
                    colon_char = ':'
                else:
                    colon_pos = colon_pos_cn
                    colon_char = ':'
            
            # 分割文本
            text_before_colon = line[:colon_pos]
            text_after_colon = line[colon_pos + 1:]
            
            # 添加冒號(hào)前的文本(粗體)
            if text_before_colon.strip():
                bold_run = paragraph.add_run(text_before_colon)
                bold_run.bold = True
            
            # 添加冒號(hào)
            paragraph.add_run(colon_char)
            
            # 添加冒號(hào)后的文本
            if text_after_colon:
                paragraph.add_run(text_after_colon)
        else:
            # 沒(méi)有冒號(hào)的行,直接添加
            paragraph.add_run(line)

def main():
    """
    主函數(shù)
    """
    file_path = "AI_zero2hero20250606.docx"
    
    print("開始處理Word文檔...")
    print(f"目標(biāo)文件: {file_path}")
    print("處理規(guī)則:")
    print("1. 冒號(hào)前面同一行的文本 → 粗體")
    print("2. 序號(hào)開頭的整行文本 → 粗體")
    print("   支持格式: 1. 2. 3. / 1) 2) 3) / (1) (2) (3) / 一、二、三、/ A. B. C. 等")
    print("-" * 50)
    
    make_text_bold_with_numbering(file_path)

# 測(cè)試函數(shù)
def test_numbering_detection():
    """
    測(cè)試序號(hào)檢測(cè)功能
    """
    test_cases = [
        "1. 這是第一項(xiàng)",
        "2) 這是第二項(xiàng)", 
        "(3) 這是第三項(xiàng)",
        "一、第一章內(nèi)容",
        "第二節(jié) 重要內(nèi)容",
        "A. 選項(xiàng)A",
        "I. 羅馬數(shù)字一",
        "1.1 子項(xiàng)目",
        "1.1.1 三級(jí)項(xiàng)目",
        "   4. 帶空格的序號(hào)",
        "這不是序號(hào)",
        "問(wèn)題: 這里有冒號(hào)",
    ]
    
    print("測(cè)試序號(hào)檢測(cè)功能:")
    for test_text in test_cases:
        is_numbered = is_numbered_line(test_text)
        print(f"'{test_text}' → {'是序號(hào)' if is_numbered else '不是序號(hào)'}")

if __name__ == "__main__":
    # 檢查庫(kù)安裝
    try:
        from docx import Document
        print("python-docx 庫(kù)已安裝")
    except ImportError:
        print("請(qǐng)先安裝 python-docx 庫(kù):")
        print("pip install python-docx")
        exit(1)
    
    # 可以先運(yùn)行測(cè)試看看序號(hào)檢測(cè)是否正確
    # test_numbering_detection()
    # print("-" * 50)
    
    main()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容