Python 查找中文字符串

前言

最近项目有遇到一个国际化的需求,要把项目中的中文(非注释性质)找出来,以便给专业翻译公司翻译。幸运的是,项目所用框架是支持多语言的。然而,在二次开发的过程中,由于没有强制要求「充分使用语言包」的开发规范,程序猿开发的时候为了省事,自然是「随心所欲」。因此,项目中的所有文件都有可能包含中文。

对于目录结构不深、代码文件数较少的项目来说,人工去翻阅代码进行匹配是一种可行的方式。不巧的是,日积月累的业务需求导致项目并不满足上述条件。都说 Python 强大,前阵子也学了些皮毛,刚好可以小试牛刀。

注:本文使用的为 Python 3

Show My Code

简易匹配

1
2
3
4
5
6
import re
regex = r"[\u4e00-\u9fa5]+"
teststr = "Hi, 我是一个字符串,我包含中文"
matches = re.findall(regex, teststr)
for match in matches:
print(match)

以上代码将从字符串中找出所有中文,以数组形式存放进 matches 中。遍历数组并输出匹配结果:

1
2
我是一个字符串
我包含中文

进阶匹配

最基本的功能目前实现了,下面只要把逐个打开文件,再逐行匹配就能达到目的。考虑到项目特点,中文字符串大多数出现在引号(包括单引号、双引号)之中,需要对匹配式稍作修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import codecs
import re
import os

def list_all_files(rootdir):
files = []
# 列出文件夹下所有的目录与文件
list = os.listdir(rootdir)
for i in range(0, len(list)):
path = os.path.join(rootdir, list[i])
if os.path.isdir(path):
files.extend(list_all_files(path))
if os.path.isfile(path):
files.append(path)
return files

# 项目目录
path = r"D:\wamp64\www\project"
files = list_all_files(path)
regex = r"(['])([^']*[\u4e00-\u9fa5]+.*?)\1|([\"])([^\"]*[\u4e00-\u9fa5]+.*?)\1"
for file in files:
f = open(file, "r", encoding="utf8")
for line in f.readlines():
matches = re.findall(regex, line)
for match in matches:
print(match[1])
f.close()