• 字符串和文本 (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() 来实现, 我感觉切片也是一样的
    • 正则表达式, 才是处理字符串, 最为通用的方法
  • 相关阅读:
    Silverlight与WPF开发人员入门应该知道的十件事
    Silverlight4.0教程之使用鼠标右键事件和滚轮事件
    Silverlight实用窍门系列:4.Silverlight 4.0添加鼠标右键菜单和Silverlight全屏模式的进入退出。【附带源码实例】
    将moss 2007的模板文件导入到moss 2010
    Silverlight4.0教程之打印报表和图形
    .NET MessageBox 网页弹出消息框
    使用sharepoint自带的文本编辑器1
    C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):目录
    推荐一个非常好的在线免费的 Photoshop
    Silverlight游戏设计(Game Design):目录
  • 原文地址:https://www.cnblogs.com/chenjieyouge/p/12897733.html
Copyright © 2020-2023  润新知