如何用Python/正则/Excel分离中英混杂词汇并生成分栏对照表
问题描述
- 待处理对象为存储中英混杂专业词汇的纯文本文件,词条以空格为分隔符,原始文本示例:
Above Ground 地面上 AG Abutment 橋臺 ABUT Acceptance Quality Level 可接受品質水準 AQL Acoustical 隔音 ACOUS Adit 隧道橫坑 Advanced Shoring Method 支撐先進工法 - 词条结构规则:基础结构为「英文词条+中文词条」,部分词条在中文后附带全大写英文缩写,单条词条参考:
Abutment 橋臺 ABUT - 处理目标:将所有词条整理为英文、中文各占一列的两列表格。
- 现有尝试:最初计划使用numpy、正则表达式实现需求,同时希望了解Excel类无代码的简便替代方案;自行编写的正则代码运行报错,代码如下:
import re path = 'wordlist.txt' file = open(path, "r") result = re.match(r"([\u4e00-\u9fa5]*)([A-Za-z\s]*)", file) print(result.group(1)) print(result.group(2))
- 报错信息:
Traceback (most recent call last): File "c:\Users\...\Desktop\web dev\parsetextforQuizlet\sepretatchiEng.py", line 5, in <module> result = re.match(r"([\u4e00-\u9fa5]*)([A-Za-z\s]*)", file) File "C:\Users\...\AppData\Local\Programs\Python\Python39\lib\re.py", line 191, in match return _compile(pattern, flags).match(string) TypeError: expected string or bytes-like object
报错原因
- 类型错误:
re.match方法要求传入字符串/字节类型参数,代码直接传入了open()返回的文件对象,未调用read()方法读取文件实际内容,触发类型校验失败。 - 正则逻辑错误:编写的匹配规则顺序为「先匹配中文、再匹配英文」,和实际词条「英文在前、中文在后」的结构完全相反;同时未处理多词英文、繁体中文、可选缩写的边界,即使修复类型错误也无法正确拆分词条。
可行实现方案
方案1:Python正则实现(无额外依赖)
代码适配原始文本的「英-中-可选缩写」循环结构,运行后可直接打印markdown格式表格,也可导出为UTF-8编码的CSV文件直接用Excel打开,无乱码问题:
import re import csv # 读取文件内容,若文件为繁体中文big5编码可将encoding替换为'big5' with open('wordlist.txt', 'r', encoding='utf-8') as f: content = f.read().strip() # 正则规则说明: # 1. 匹配英文词条:以大写英文字母开头,由大小写英文、空格组成,非贪婪匹配到中文前截止 # 2. 匹配中文词条:匹配所有繁体/简体中文字符 # 3. 匹配可选缩写:中文后0或1组2-5位长度的全大写英文 # 4. 正向预查:缩写后必须接下一个大写开头的英文词条,或到达文本末尾,避免匹配错位 pattern = re.compile( r'([A-Z][A-Za-z\s]*?)\s*([\u4e00-\u9fff]+)\s*([A-Z]{2,5})?(?=\s+[A-Z]|\s*$)' ) matches = pattern.findall(content) # 整理词条,缩写附在英文词条后 word_list = [] for eng, chn, abbr in matches: eng_clean = eng.strip() if abbr: eng_clean = f"{eng_clean} ({abbr})" word_list.append( (eng_clean, chn.strip()) ) # 打印markdown表格 print("| 英文词条 | 中文释义 |") print("|----------|----------|") for eng, chn in word_list: print(f"| {eng} | {chn} |") # 导出为CSV文件(供Excel使用),取消下方注释即可 # with open('词汇表结果.csv', 'w', encoding='utf-8-sig', newline='') as f: # writer = csv.writer(f) # writer.writerow(["英文词条", "中文释义"]) # writer.writerows(word_list)
针对给出的示例文本,运行后输出结果为:
| 英文词条 | 中文释义 |
|---|---|
| Above Ground (AG) | 地面上 |
| Abutment (ABUT) | 橋臺 |
| Acceptance Quality Level (AQL) | 可接受品質水準 |
| Acoustical (ACOUS) | 隔音 |
| Adit | 隧道橫坑 |
| Advanced Shoring Method | 支撐先進工法 |
方案2:Excel无代码实现
不需要写脚本,直接用Excel公式即可完成拆分,步骤如下:
- 将原始文本拆分到A列,每行对应一个完整词条块。
- 提取中文:在B1单元格输入公式
=TEXTJOIN("",TRUE,IF(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1)>"z",MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1),"")),365/2021及以上版本Excel直接回车,旧版Excel按Ctrl+Shift+Enter确认数组公式,即可提取单元格内所有中文字符。 - 提取英文(含缩写):在C1单元格输入公式
=TRIM(SUBSTITUTE(A1,B1,"")),即可剔除中文内容,得到清理后的英文+缩写部分。 - 选中B1、C1单元格下拉填充所有行,复制B、C列后粘贴为值,删除多余列即可得到最终两列表格。
内容的提问来源于stack exchange,提问作者Veritas
相关产品推荐
相关产品推荐

