美文网首页
【2017-08-23】字符串及文本的处理(二)

【2017-08-23】字符串及文本的处理(二)

作者: 小蜗牛的成长 | 来源:发表于2017-08-23 11:42 被阅读0次

    字符串的搜索与替换

    • 匹配或搜索特定模式的文本
      • 字符串方法
        str.find(substr) 主要为查找字符串中是否出现指定模式的文本,出现,返回首个出现的位置索引,不出现,返回-1
    #实例
    str1="21-year-old raises half-million for polar journey for"
    print(str1.find("for"))
    
    - 较复杂时,通常使用正则表达式
    re.match()  从字符串开始去匹配,匹配到返回对象,需要取出已匹配到的文本,用group()方法
    re.findall()   返回匹配到的文本列表
    re.finditer()  返回匹配到的文本迭代对象
    re.compile()  将模式字符串预编译成模式对象,可重复使用,一次编译,多次使用,对于用同一模式匹配多个字符串的情形,非常适用,一定程度上优化了性能。
    
    #实例
    import  re
    str1="21-year-old raises half-million for polar journey for 32"
    result= re.match(r"\w*\d+\w*",str1)
    allresult=re.findall(r"\w*\d+\w*",str1)
    iterresult=re.finditer(r"\w*\d+\w*",str1)
    if result:
           print(result.group()) #结果为21,仅匹配
    首个出现文本,并返回对象
    print(allresult)#结果为['21','32']
    for i in iterresult:
           print(i.group())
    
    上述模式多次被重复使用,可使用compile一次编译,多次使用
    
    #上述情形可修改为一次编译,多次利用:
    str1 = "21-year-old raises half-million for polar journey for 32"
    pattern=re.compile(r"\w*\d+\w*")
    result=pattern.match(str1)
    allresult=pattern.findall(str1)
    iterresult=pattern.finditer(str1)
    if result:
           print(result.group())
    print(allresult)
    for i in iterresult:
           print(i.group())
    
    • 字符串替换
      • 简单使用,字符串方法
        str.replace()
    text = 'yeah, but no, but yeah, but no, but yeah'
    newtext=text.replace('yeah',"new")
    print(newtext)
    
    -  复杂使用,正则表达式
      re.sub() 根据正式表达式模式,匹配并替换
    
    import  re
    text1 = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
    newtext1=re.sub(r"(\d+)/(\d+)/(\d+)",r"\3-\1-\2",text1)
    print(newtext1)#结果:Today is 2012-11-27. PyCon starts 2013-3-13.
    

    上述例子涉及到正则表达式中的捕获分组和非捕获分组的概念
    捕获组:()表示一个字表达式,捕获出符合括号内的内容,可以通过从左到右计算组编号,从而可以引用组的编号来引用前面匹配到的文本
    非捕获组:以 (?) 开头的组是纯的非捕获 组,它不捕获文本 ,也不针对组合计进行计数。
    常见的几种非捕获组:匹配表达式X,但是不包含表达式的文本
    (?=X ) 仅当子表达式 X 在此位置的右侧时才继续匹配,例如,/w+(?=/d) 与后跟数字的单词匹配,而不与该数字匹配。换言之,限制
    了右侧为X时才进行匹配
    (?!X ) 仅当子表达式 X 不在 此位置的右侧匹配时才继续匹配。例如,例如,/w+(?!/d) 与后不跟数字的单词匹配,而不与该数字匹配
    换言之,限制了右侧不为X时才进行匹配 。
    (?<=X ) 仅当子表达式 X 在 此位置的左侧匹配时才继续匹配。例如,(?<=19)99 与跟在 19 后面的 99 的实例匹配。换言之,限制了左侧为X时才进行匹配
    (?<!X ) 仅当子表达式 X 不在此位置的左侧匹配时才继续匹配。例如,(?<!19)99 与不跟在 19 后面的 99 的实例匹配。换言之,限制了左侧不为X时才进行匹配

    相关文章

      网友评论

          本文标题:【2017-08-23】字符串及文本的处理(二)

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