详解Python中re.sub

简介:

re.sub的功能


re是regular expression的所写,表示正则表达式


sub是substitute的所写,表示替换;


re.sub是个正则表达式方面的函数,用来实现通过正则表达式,实现比普通字符串的replace更加强大的替换功能;


举个最简单的例子:

如果输入字符串是:       
inputStr = "hello 111 world 111"


那么你可以通过     
replacedStr = inputStr.replace("111", "222")

去换成   
"hello 222 world 222"


但是,如果输入字符串是:    
inputStr = "hello 123 world 456"


而你是想把123和456,都换成222

(以及其他还有更多的复杂的情况的时候),

那么就没法直接通过字符串的replace达到这一目的了。


就需要借助于re.sub,通过正则表达式,来实现这种相对复杂的字符串的替换:     
replacedStr = re.sub("\d+", "222", inputStr)


当然,实际情况中,会有比这个例子更加复杂的,其他各种特殊情况,就只能通过此re.sub去实现如此复杂的替换的功能了。


所以,re.sub的含义,作用,功能就是:

对于输入的一个字符串,利用正则表达式(的强大的字符串处理功能),去实现(相对复杂的)字符串替换处理,然后返回被替换后的字符串

其中re.sub还支持各种参数,比如count指定要替换的个数等等。


下面就是来详细解释其各个参数的含义。

  
re.sub的各个参数的详细解释


re.sub共有五个参数。

其中三个必选参数:pattern, repl, string

两个可选参数:count, flags

  
第一个参数:pattern

pattern,表示正则中的模式字符串,这个没太多要解释的。

需要知道的是:

    反斜杠加数字(\N),则对应着匹配的组(matched group)   
        比如\6,表示匹配前面pattern中的第6个group    
        意味着,pattern中,前面肯定是存在对应的,第6个group,然后你后面也才能去引用

比如,想要处理:   
hello crifan, nihao crifan

且此处的,前后的crifan,肯定是一样的。


而想要把整个这样的字符串,换成crifanli

则就可以这样的re.sub实现替换:   

1
2
3
inputStr  =  "hello crifan, nihao crifan" ;    
replacedStr  =  re.sub(r "hello (\w+), nihao \1" "crifanli" , inputStr);    
print  "replacedStr=" ,replacedStr;  #crifanli

 

第二个参数:repl

repl,就是replacement,被替换,的字符串的意思。

repl可以是字符串,也可以是函数。

  
repl是字符串

如果repl是字符串的话,其中的任何反斜杠转义字符,都会被处理的。

即:

    \n:会被处理为对应的换行符;   
    \r:会被处理为回车符;    
    其他不能识别的转移字符,则只是被识别为普通的字符:    
        比如\j,会被处理为j这个字母本身;    
    反斜杠加g以及中括号内一个名字,即:\g<name>,对应着命了名的组,named group


接着上面的举例:

想要把对应的:   
hello crifan, nihao crifan

中的crifan提取出来,只剩:   
crifan


就可以写成:   

1
2
3
inputStr  =  "hello crifan, nihao crifan" ;    
replacedStr  =  re.sub(r "hello (\w+), nihao \1" "\g<1>" , inputStr);    
print  "replacedStr=" ,replacedStr;  #crifan

 

对应的带命名的组(named group)的版本是:   

1
2
3
inputStr  =  "hello crifan, nihao crifan" ;    
replacedStr  =  re.sub(r "hello (?P<name>\w+), nihao (?P=name)" "\g<name>" , inputStr);    
print  "replacedStr=" ,replacedStr;  #crifan

  
repl是函数

举例说明:

比如输入内容是:   
hello 123 world 456

想要把其中的数字部分,都加上111,变成:   
hello 234 world 567

那么就可以写成:     

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/python    
# -*- coding: utf-8 -*-
       
import  re;      
def  pythonReSubDemo():        
"""            demo Pyton re.sub        
"""        
inputStr  =  "hello 123 world 456" ;             
 
def  _add111(matched):            
intStr  =  matched.group( "number" ); 
#123            
intValue  =  int (intStr);            
addedValue  =  intValue  +  111
#234            
addedValueStr  =  str (addedValue);            
return  addedValueStr;                 
replacedStr  =  re.sub( "(?P<number>\d+)" , _add111, inputStr);        
print  "replacedStr=" ,replacedStr; 
#hello 234 world 567
 
if  __name__ = = "__main__" :       
pythonReSubDemo();

  
第三个参数:string

string,即表示要被处理,要被替换的那个string字符串。

没什么特殊要说明。

  
第四个参数:count

举例说明:

继续之前的例子,假如对于匹配到的内容,只处理其中一部分。

比如对于:   
hello 123 world 456 nihao 789

只是像要处理前面两个数字:123,456,分别给他们加111,而不处理789,

那么就可以写成:   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/python    
# -*- coding: utf-8 -*-      
 
import  re;      
def  pythonReSubDemo():        
"""            demo Pyton re.sub        
"""        
inputStr  =  "hello 123 world 456 nihao 789" ;   
           
def  _add111(matched):            
intStr  =  matched.group( "number" ); 
#123            
intValue  =  int (intStr);            
addedValue  =  intValue  +  111
#234            
addedValueStr  =  str (addedValue);            
return  addedValueStr; 
                 
replacedStr  =  re.sub( "(?P<number>\d+)" , _add111, inputStr,  2 );        
print  "replacedStr=" ,replacedStr; 
#hello 234 world 567 nihao 789
 
if  __name__ = = "__main__" :       
pythonReSubDemo();

  
第五个参数:flags















本文转自UltraSQL51CTO博客,原文链接: http://blog.51cto.com/ultrasql/1704885,如需转载请自行联系原作者



相关文章
|
5月前
|
Python
python re.sub 替换不完全
python re.sub 替换不完全
32 0
|
Python
Python基础——re表达式中re.sub()的用法
Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。
156 0
|
Python
Python:正则re.sub实现简易的模板引擎
Python:正则re.sub实现简易的模板引擎
|
SQL PHP 数据库
Python:正则re.sub实现SQL命名占位符替换
Python:正则re.sub实现SQL命名占位符替换
230 0
|
5天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
5天前
|
程序员 开发者 Python
Python网络编程基础(Socket编程) 错误处理和异常处理的最佳实践
【4月更文挑战第11天】在网络编程中,错误处理和异常管理不仅是为了程序的健壮性,也是为了提供清晰的用户反馈以及优雅的故障恢复。在前面的章节中,我们讨论了如何使用`try-except`语句来处理网络错误。现在,我们将深入探讨错误处理和异常处理的最佳实践。
|
9天前
|
缓存 监控 Python
解密Python中的装饰器:优雅而强大的编程利器
Python中的装饰器是一种强大而又优雅的编程工具,它能够在不改变原有代码结构的情况下,为函数或类添加新的功能和行为。本文将深入解析Python装饰器的原理、用法和实际应用,帮助读者更好地理解和利用这一技术,提升代码的可维护性和可扩展性。
|
25天前
|
编译器 测试技术 C++
【Python 基础教程 01 全面介绍】 Python编程基础全攻略:一文掌握Python语法精髓,从C/C++ 角度学习Python的差异
【Python 基础教程 01 全面介绍】 Python编程基础全攻略:一文掌握Python语法精髓,从C/C++ 角度学习Python的差异
153 0
|
19天前
|
程序员 C语言 Python
Python列表推导式:简洁与高效的编程利器
在Python编程中,列表推导式(List Comprehension)是一种强大且优雅的工具,它允许我们以简洁的方式创建新的列表。列表推导式在Python程序员中广受欢迎,因为它能够将复杂的循环和条件语句简化为一行代码,提高代码的可读性和执行效率。
|
25天前
|
Java 编译器 Shell
【Python 基础教程 04】超详细Python编程教程:初学者入门至全面了解Python 解析器( CPython、IPython、Jython和PyPy)
【Python 基础教程 04】超详细Python编程教程:初学者入门至全面了解Python 解析器( CPython、IPython、Jython和PyPy)
42 0