美文网首页
137、字符串对象方法及正则表达式

137、字符串对象方法及正则表达式

作者: 陈容喜 | 来源:发表于2018-02-02 17:04 被阅读0次

    字符串对象方法

    以逗号分隔的字符串可用split拆分成数段: 1.png split结合strip(用于修剪空白符(包括换行符))一起使用: 2.png 使用join方法把字符串与指定的字符拼接起来: 3.png 使用in、index和find检测子字符串: 4.png find和index的区别:如果找不到字符串,find会返回-1;index将会引发一个异常。 5.png count函数返回指定子字符串的出现次数: 6.png replace用于将指定模式替换为另一个模式: 7.png python内置的字符串方法: 8.png 9.png

    正则表达式

    正则表达式(通常称作regex)提供一种灵活的在文本中搜索或匹配字符串模式的方式。正则表达式是根据正则表达式语言编写的字符串。Python内置的re模块负责对字符串应用正则表达式。
    re模块的函数分为三个大类:模式匹配、替换和拆分。

    例如:拆分一个字符串,分隔符为数量不定的一组空白符(制表符、空格、换行符等)。描述一个或多个空白符的正则表达式是\s+: 21.png 调用re.split('\s+',text)时,正则表达式会先被编译,然后在text上调用split方法。可以使用re.compile编译regex得到一个可重用的regex对象: 22.png 使用findall方法返回的是字符串中所有的匹配项: 23.png 下面是一段文本及一条能够识别大部分电子邮件地址的正则表达式: 24.png

    如果对多条字符串应用同一条正则表达式,可以通过re.compile创建regex对象,可以节省大量CPU时间。

    使用search返回的是文本中第一个电子邮件地址: 25 .png regex.match则返回None,因为它只匹配出现在字符串开头的模式: 26.png 使用sub方法,将匹配到的模式替换为指定字符串,并返回所得到的新字符串: 27.png 将电子邮件地址分成3个部分:用户名、域名以及域后缀,需要将待分段的模式的各个部分用圆括号包起来,并通过groups方法返回一个由模式各段组成的元组: 28.png 对于带有分组功能的模式,findall会返回一个元组列表: 29.png sub通过\1、\2、\3的特殊符号访问各匹配项中的分组: 30.png 为各个匹配分组加上一个名称,并返回一个带有分组名称的字典: 31.png

    正则表达式方法: 55.png

    源码:

    # coding: utf-8
    
    # ## 字符串对象方法
    
    # In[1]:
    
    # 以逗号分隔的字符串可以用split拆分成数段
    language = 'Python,Java, C, C++'
    language.split(',')
    
    
    # In[2]:
    
    # split结合strip(用于修剪空白符(包括换行符))一起使用:
    pieces = [x.strip() for x in language.split(',')]
    print(pieces)
    
    
    # In[3]:
    
    # 使用join方法连接字符串
    lis = ['first','second','third']
    '::'.join(lis)
    
    
    # ### 子字符串定位
    
    # In[4]:
    
    val = 'is,or,that'
    'that' in val
    
    
    # In[5]:
    
    # 指出第一个出现的','在字符串中的位置
    val.index(',')
    
    
    # In[6]:
    
    # find也是返回查找的第一个字符在原来字符串中的位置
    val.find('or')
    
    
    # ### find和index的区别
    
    # In[7]:
    
    val.find(':')
    
    
    # In[8]:
    
    val.index(':')
    
    
    # In[9]:
    
    # count函数返回指定字符出现的次数
    val.count('t')
    
    
    # In[10]:
    
    # replace用于指定模式替换为另一个模式
    val.replace(',','::')
    
    
    # In[11]:
    
    val.replace(',','')
    
    
    # ## 正则表达式
    
    # In[12]:
    
    # 使用正则表达式拆分字符串
    import re
    text = 'foo  bar\t baz \tqux'
    re.split('\s+',text)
    
    
    # In[13]:
    
    # 使用re.compile编译regex得到可重用的regex对象
    regex = re.compile('\s+')
    regex.split(text)
    
    
    # In[14]:
    
    # 使用findall方法,得到匹配regex的所有模式
    regex.findall(text)
    
    
    # In[15]:
    
    # 识别电子邮件地址
    text = '''Dave dave@google.com
    Steve steve@gmail.com
    Rob rob@gmail.com
    Ryan ryan@yahoo.com
    '''
    pattern = r'[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}'
    
    # re.IGNORECASE的作用是使正则表达式对大小写不敏感
    regex = re.compile(pattern,flags=re.IGNORECASE)
    
    # 对text使用findall将得到一组电子邮件地址
    regex.findall(text)
    
    
    # In[16]:
    
    # search返回的是文本中第一个电子邮件地址
    m = regex.search(text)
    print(m)
    
    
    # In[17]:
    
    text[m.start():m.end()]
    
    
    # In[18]:
    
    # regex.match只匹配出现在字符串开头的模式
    print(regex.match(text))
    
    
    # In[19]:
    
    # 使用sub方法,将匹配到的模式替换为指定字符串,并返回所得到的新字符串
    print(regex.sub('REDACTED',text))
    
    
    # In[20]:
    
    # 将地址分成3个部分:用户名、域名以及域后缀
    pattern = r'([A-Z0-9._%+-]+)@([A-Z0-9.-]+)\.([A-Z]{2,4})'
    regex = re.compile(pattern,flags=re.IGNORECASE) 
    m = regex.match('wesm@bright.net')
    # 通过groups方法返回一个元组
    m.groups()
    
    
    # In[21]:
    
    # 对于带有分组功能的模式,findall会返回一个元组列表
    regex.findall(text)
    
    
    # In[22]:
    
    # sub通过\1、\2、\3的特殊符号访问各匹配项中的分组
    print(regex.sub(r'Username:\1,Domain:\2,Suffix:\3',text))
    
    
    # In[23]:
    
    # 为各个匹配分组加上一个名称
    regex = re.compile(r'''
    (?P<username>[A-Z0-9._%+-]+)
    @
    (?P<domain>[A-Z0-9.-]+)
    \.
    (?P<suffix>[A-Z]{2,4})''',flags=re.IGNORECASE|re.VERBOSE)
    m = regex.match('wesm@bright.net')
    # 调用groupdict()返回带有分组名称的字典
    m.groupdict()
    

    相关文章

      网友评论

          本文标题:137、字符串对象方法及正则表达式

          本文链接:https://www.haomeiwen.com/subject/ecuezxtx.html