將帶序號(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()