selfteaching / selfteaching/selfteaching-python-camp
【内容总结】 整理:中英文文本替换、筛选方法
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
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- 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