python 正则表达式

最近写了一个python脚本,用来查找文本中的函数并进行替换,用到一些正则表达式的知识,所以记录一下。

内容摘自https://www.cnblogs.com/yyyg/p/5498803.html

一、介绍

正则表达式是一个特殊的字符序列,能帮助我们检查字符串是否与某种模式匹配。

二、常用字符含义

1. 普通字符和11个元字符:


ps. 字符集[]中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c]; [^abc]表示取反,即非abc; 用\反斜杠转义恢复特殊字符的特殊含义。

2. 预定义字符集:


3. 特殊分组:


三、re模块常用功能函数

正则表达式使用反斜杠” \ “来代表特殊形式或用作转义字符,这里跟Python的语法冲突,因此,Python用” \\ “表示正则表达式中的” \ “,因为正则表达式中如果要匹配” \ “,需要用\来转义,变成” \ “,而Python语法中又需要对字符串中每一个\进行转义,所以就变成了” \\ “。

上面的写法是不是觉得很麻烦,为了使正则表达式具有更好的可读性,Python特别设计了原始字符串(raw string),需要提醒你的是,在写文件路径的时候就不要使用raw string了,这里存在陷阱。raw string就是用’r’作为字符串的前缀,如 r”\n”:表示两个字符”\”和”n”,而不是换行符了。Python中写正则表达式时推荐使用这种形式。

1、 re.findall(pattern, string[, flags]):

方法能够以列表的形式返回能匹配的子串。先看简单的例子:

1
2
3
4
5
import  re
=  'one1two2three3four4'
ret  =  re.findall(r '(\d+)' ,a)
print (ret)
[ '1' '2' '3' '4' ]

从上面的例子可以看出返回的值是个列表,并且返回字符串中所有匹配的字符串。 

2、re.finditer(pattern, string[, flags])

搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。 请看例子:

1
2
3
4
5
6
7
8
import  re
  
=  re. compile (r '\d+' )
for  in  p.finditer( 'one1two2three3four4' ):
     print  m.group(),
 
### output ###
# 1 2 3 4 

3、re.match和re.search

Python提供了两种不同的原始操作:match和search。match是从字符串的起点开始做匹配,而search(perl默认)是从字符串做任意匹配。看个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import  re
 
ret_match =  re.match( "c" , "abcde" );      #从字符串开头匹配,匹配到返回match的对象,匹配不到返回None
if (ret_match):
     print ( "ret_match:" + ret_match.group());
else :
     print ( "ret_match:None" );
 
ret_search  =  re.search( "c" , "abcde" );  #扫描整个字符串返回第一个匹配到的元素并结束,匹配不到返回None
if (ret_search):
     print ( "ret_search:" + ret_search.group());
 
ret_match: None
ret_search:c

   re.match对象拥有以下方法:

复制代码
import re
a = "123abc456"
ret_match= re.match("a","abcde");
print(ret_match.group())  #返回返回被 RE 匹配的字符串
print(ret_match.start())  #返回匹配开始的位置
print(ret_match.end())    #返回匹配结束的位置
print(ret_match.span())   #返回一个元组包含匹配 (开始,结束) 的位置
复制代码

其中group()方法可以指定组号,如果组号不存在则返回indexError异常看如下例子:

1
2
3
4
5
6
import  re
=  "123abc456"
re.search( "([0-9]*)([a-z]*)([0-9]*)" ,a).group( 0 )    #123abc456,返回整体默认返回group(0)
re.search( "([0-9]*)([a-z]*)([0-9]*)" ,a).group( 1 )    #123
re.search( "([0-9]*)([a-z]*)([0-9]*)" ,a).group( 2 )    #abc
re.search( "([0-9]*)([a-z]*)([0-9]*)" ,a).group( 3 )    #456

4、re.sub和re.subn

 两种方法都是用来替换匹配成功的字串,值得一提的时,sub不仅仅可以是字符串,也可以是函数。subn函数返回元组,看下面例子:

1
2
3
4
5
6
import   re
#sub
ret_sub  =  re.sub(r '(one|two|three)' , 'ok' , 'one word two words three words' #ok word ok words ok words
#subn
import   re
ret_subn  =  re.subn(r '(one|two|three)' , 'ok' , 'one word two words three words' #('ok word ok words ok words', 3) 3,表示替换的次数

  

5、re.split(pattern, string, maxsplit=0)

通过正则表达式将字符串分离。如果用括号将正则表达式括起来,那么匹配的字符串也会被列入到list中返回。maxsplit是分离的次数,maxsplit=1分离一次,默认为0,不限制次数。看一下例子:

1
2
3
4
import  re
ret  =  re.split( '\d+' , 'one1two2three3four4' #匹配到1的时候结果为'one'和'two2three3four4',匹配到2的时候结果为'one', 'two'和'three3four4', 所以结果为:
####output####
[ 'one' 'two' 'three' 'four' , '']

  

6、re.compile(strPattern[, flag])

这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。第二个参数flag是匹配模式,取值可以使用按位或运算符’|’表示同时生效,比如re.I | re.M。另外,你也可以在regex字符串中指定模式,比如re.compile(‘pattern’, re.I | re.M)与re.compile(‘(?im)pattern’)是等价的。可选值有:

1
2
3
4
5
6
re.I(IGNORECASE): 忽略大小写(括号内是完整写法,下同)
re.M(MULTILINE): 多行模式,改变 '^' '$' 的行为(参见上图)
re.S(DOTALL): 点任意匹配模式,改变 '.' 的行为
re.L(LOCALE): 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定
re.U( UNICODE ): 使预定字符类 \w \W \b \B \s \S \d \D 取决于 unicode 定义的字符属性
re.X(VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。

请看例子:

1
2
3
4
5
6
import  re
text  =  "JGood is a handsome boy, he is cool, clever, and so on..."
regex  =  re. compile (r '\w*oo\w*' )
print (regex.findall(text))
 
[ 'JGood' 'cool' ]


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值