字符串和文本 (01)

回头一想, 字符串才是各个编程语言通用的呀, 我感觉 Python 语言在对字符串的处理支持上, 更加的便捷哦. 其实呢, 又说到语言,深深觉得, JavaScript 才是最流行的语言呀, 之前就该好好学学前台技术, 感觉现在都赶不上了, 虽然我不做程序员, 但数据方面, 也是要展示, 可视化的, 目前除了 Tableau 比较靠谱, 其余的, 总感觉菜的一批, 其实还会涉及一些, web 的东西... 真的是做个数据工作, 咋就那么难搞....

不扯了, 回到字符串, 无非就是一些, 查询, 搜索替换 (正则表达式), 分割, 拼接等这些操作而已.

多界定符分割字符串

需求

对字符串进行分割, 但分隔符不固定(还有周围有空格).

方案

string 对象的 split() 方法只适应于, 非常简单的字符串分割场景, 它不允许有多个分隔符或者, 分隔符周围有不确定的空格. 但现在要能够更加灵活地切割字符串的时候, 就可以用正则了呀, re.split() 方法来弄.

import re 

line =  'asdf fjdk; afed, fjek,asdf, foo' 

# 按照 ", ; 空白" 来进行分割

ret = re.split(r"[;,\s]\s*", line)
print(ret)
['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']

用上正则就非常灵活强大了, re.split() 返回 和 str.split() 的结果一样, 都是 list. 注意点是, 当使用 re.split() 时, 需注意正则中是否包含括号分组. 如果捕获了分组, 则匹配的文本也将出现在结果列表中.

fields = re.split(r"(;|, |\s)\s*", line)
print(fields)
['asdf', ' ', 'fjdk', ';', 'afed', ', ', 'fjek,asdf', ', ', 'foo

获取分隔符, 在某些场景下也是有用的. 如下面这种重新构造一个新的输出字符串场景.

values = fields[::2]
delimiters = fields[1::2] + ['']

print(values)
print(delimiters)

# 重新拼接
"".join(v + d for v, d in zip(values, delimiters))
['asdf', 'fjdk', 'afed', 'fjek,asdf', 'foo']

[' ', ';', ', ', ', ', '']

'asdf fjdk;afed, fjek,asdf, foo'

更多是, 不想保留分割字符到结果列表, 但仍需要用到 括号来进行正则分组, 这就要好好写 正则表达式了.

re.split(r"(?:, |;|\s)\s*", line)
['asdf', 'fjdk', 'afed', 'fjek,asdf', 'foo']

正则中, "|" 表示 or 的关系

字符串开关或结尾匹配

需求

通过指定的文本模式去检查字符串的开头或结尾, 比如文件名后缀, url 等

方案

str.startswith() 和 str.endswith()

用这两个方法就对了, 虽然我平时也不咋用的. 返回是 True 或 False.

file_name = "spam.txt"
url = "http://www.python.org"

print(file_name.endswith(".txt"))
print(file_name.startswith("file."))
print(url.startswith('http:'))
True
False
True

对于检查多种匹配功能, 只需将所有匹配项放入到一个元组中去, 然后传递 startswith() 或 endswith().

import os

files = os.listdir()
print(files)

# 一定要是元组哦, 很奇怪的一点
[name for name in files if name.endswith(('nb', '.py'))]
['.ipynb_checkpoints', '字符串和文本.ipynb', '数据结构与算法.ipynb']
['字符串和文本.ipynb', '数据结构与算法.ipynb']

类似的操作也可以用字符串切片来完成, 我之前判断的 xlsx, xls 等, 都是通过切片等, 还结合 rfind(.) 是有一些不够优雅哦.

file_name = "spam.txt"
print(file_name[-4:] == ".txt")

url = "http:/www.python.org"
url[:5] == "http:" or url[:6] == "https:" or url[:4] == 'ftp'
True
True

当然, 最强还是用正则, 真的是可以为所欲为的.

import re 

url = "http://www.python.org"
re.match("http:|https:", url).group()
'http:'

用 re 模块来做这样简单的正则匹配, 似乎有些, 没必要啊, 还不如直接 endswith() .. 这样的字符串方法. 更多的场景, 其实是用在文件匹配上, 我通常会用切片或者是 golb 来做, 现在感觉优先用 startswith... 这样的被遗忘的方法也是可以哦

import os 

if any(name.endswith(('.xls', '.py', 'xlsx') for name in listdir(dirname)))

感觉在文件匹配上, 还是 glob 结合正则来匹配文件更加适合一些哦

小结

  • 字符串分割符, 可以用 re.split() 正则来灵活匹配
  • 字符开头, 结尾匹配用 startswith() 和 endswith() 来实现, 我感觉切片也是一样的
  • 正则表达式, 才是处理字符串, 最为通用的方法
posted @ 2020-05-15 22:53  致于数据科学家的小陈  阅读(186)  评论(0编辑  收藏  举报