selfteaching / selfteaching/selfteaching-python-camp

【内容总结】 整理:中英文文本替换、筛选方法

Open
#1,568 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
151
Forks
875
PR merge metrics
No merged PRs in 30d

Description

一、替换
1.Python 的string 有一个 replace method,它的用法是这样的string.replace(a, b)所表达的意思是:把 string 中的所有 a 字符串换成 b 字符串。
需要注意的是,这个 replace method 并不支持正则表达式… 属于“简单粗暴”的类型~

2.调用一个内置的“re”,这个东西我暂时还没去深入理解它,只知道它的用法是这样的:

Import re                # 先导入,下面是在代码内容中的应用
i = re.compile(“[a-A]”)  # 用 re  的 compile method 设置一个正则表达式
j = i.sub(a, string)     # 然后用这个正则表达式的sub method 就可以替换文本了,这里的 a 就是你需要换成的文本。

二、筛选:
1.筛选中文字符
笨笨如我,先把英文给去掉了,在去掉各种中英文标点符号,一不小心就写漏了…
看同学们的作业里,普遍有两种高效解决方式,一个使用类似u'\u4e00’这种格式,另一个是使用 ord( )这个build-in函数
这两种方法其实都是一样的,只不过表达上不同,所涉及到都是符号的unicode。
原理是,在编程世界里,所有的字符(不仅仅是中英文)都是有一个编码对应的,而同一类的字符的编码是有规律的,比如相连。
于是,我们只要找到中文对应的编码范围,然后把整个 text 过滤一下,只留下编码在这个范围内的字符,就行了:

list_cn = [ t for t in text if u'\u4e00' <= i <= u'\u9fa5’]

这样就能够生成一个只有中文的list(注意,中文的标点符号也没有在这两个编码'\u4e00’'\u9fa5’之间,真好~)
如果想用 ord(),也可以用一样的表达方式:

list_cn = [ t for t in text if 19968 <= ord(i) <= 40869]

用哪个呢,从我自己小白的角度来看,前面一种表达更适合装逼一些… 嘎嘎~

我看到有些同学使用的是 ord(i) <= 256,意思是,“非英文”(英文的 unicode 都在256之内),我觉得这个比上面的差一些,因为还要再进行一次“去掉中文标点符号”。

2.筛选英文字符
你可能第一感觉是这么想的,像中文一样找到字母的范围就可以了。但确实不一样,因为英文字母里有大写小之分,大小字母的编码不是连在一块的 —— 实际上,它们是,大写连一块,小写连一块,中间散布着标点符号...
如果想要使用上面的方法,可以考虑先把所有字母小写放在第一步,然后找到小写字母的编码(97 ~ 122)
于是,

list_en = [ t for t in text if 97 <= ord(i) <= 122]

好吧,又事实上,这么做会得到一个极其坑爹的结果,因为连空格和\n(这两者是不一样的代码)都被清洗了。于是我们可以在原来的条件上再加入条件“编码等于空格、'\n'编码的字符也留下”...

我自己的话不用这个,而用上面提到的“re”,直接用它生成一个正则表达式,然后替换就行了,尽管我还不是很懂它~

i = re.compile("[^a-z \n]")
text_en = i.sub("", text)

(注,先把大写改小写,反正都要做的;另,注意“a-z”后面有个空格和换行符" \n")

[^a-z \n]所表达的意思是:匹配任何除了从 a 到 z 的英文小写字母以及" " 和 \n之外的符号,然后在第二部就是把这些符号全部换成了空符号(什么都没有)
另外,考虑到英文书写常常有把两个英文单词用“-”连起来的情况,如果直接把“-”去掉,会得到一个奇怪的东西... 于是我还提前把“-”换成空格~

3.说说 stirng 的那个 replace method
因为 replace 支持正则表达式,所以在处理这类复杂问题的时候,确实显得没那么好用,所以我看到很多同学一开始跟我写的一样:
text.replace(",", "").replace("。", "").replace("!", "")...... 哭着写完一大串,结果随手拿一个中文文本发现,马丹,又有符号没写进去......
如果单纯考虑这个去符号操作,我看到有人写得更简化些:
比如:(注,已经去除英文符号,而且下面例子中的标点符号串是不完整的)

for i in '*,,。.-!、?!“”""?「」':
    text = text.replace(i,'')

也有直接生成一个 list:

text_list = []
for i in text:
    if i in '*,,。.-!、?!“”""?「」':
        continue
    text_list.append(i)

高级了一些,可依然没有解决那个麻烦的问题 —— 如何全面地匹配中文符号。

所以呢,对比之下,我果断扔掉我那看起来写不到尽头的标点符号串~

纯属个人理解,我也是在入门的小白,肯定有理解不到位、考虑不足的地方,请一定帮我指出,谢谢!

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

The issue discusses Python string.replace, the re module, and Unicode-based filtering, but names no repository file, test, or entry point. Start by checking the issue discussion for a specific documentation task; no completion criteria or concrete change are provided.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
content, documentation
Issue type
Documentation
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
20/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.