Python正则表达式re模块

正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同;但不用担心,不被支持的语法通常是不常用的部分。如果已经在其他语言里使用过正则表达式,只需要简单看一看就可以上手了。

正则表达式概念

  1. 使用单个字符串来描述匹配一系列符合某个句法规则的字符串
  2. 是对字符串操作的一种逻辑公式
  3. 应用场景:处理文本和数据
  4. 正则表示是过程:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;否则匹配失败

字符匹配

字符 描述
. 匹配任意一个字符(除了\n)
\d \D 数字/非数字
\s \S 空白/非空白字符
\w \W 单词字符[a-zA-Z0-9]/非单词字符
\b \B 单词边界,一个\w与\W之间的范围,顺序可逆/非单词边界
  • 匹配任意一个字符
 # 匹配字符串abc,.代表b >>> re.match(‘a.c‘,‘abc‘).group()‘abc‘
  • 数字与非数字
 # 匹配任意一数字 >>> re.match(‘\d‘,‘1‘).group()‘1‘ # 匹配任意一个非数字 >>> re.match(‘\D‘,‘a‘).group()‘a‘
  • 空白与非空白字符
 # 匹配任意一个空白字符 >>> re.match("\s"," ").group()‘ ‘ # 匹配任意一个非空白字符 >>> re.match("\S","1").group()‘1‘ >>> re.match("\S","a").group()‘a‘
  • 单词字符与非单词字符

单词字符即代表[a-zA-Z0-9]

 # 匹配任意一个单词字符 >>> re.match("\w","a").group()‘a‘ >>> re.match("\w","1").group()‘1‘ # 匹配任意一个非单词字符 >>> re.match("\W"," ").group()‘ ‘

次数匹配

字符 匹配
* 匹配前一个字符0次或者无限次
+ 匹配前一个字符1次或者无限次
? 匹配前一个字符0次或者1次
{m}/{m,n} 匹配前一个字符m次或者N次
*?/+?/?? 匹配模式变为贪婪模式(尽可能少匹配字符)
  • 介绍
字符 匹配
prev? 0个或1个prev
prev* 0个或多个prev,尽可能多地匹配
prev*? 0个或多个prev,尽可能少地匹配
prev+ 1个或多个prev,尽可能多地匹配
prev+? 1个或多个prev,尽可能少地匹配
prev{m} m个连续的prev
prev{m,n} m到n个连续的prev,尽可能多地匹配
prev{m,n}? m到n个连续的prev,尽可能少地匹配
[abc] a或b或c
[^abc] 非(a或b或c)
  • 匹配前一个字符0次或者无限次
 >>> re.match(‘[A-Z][a-z]*‘,‘Aaa‘).group()‘Aaa‘ >>> re.match(‘[A-Z][a-z]*‘,‘Aa‘).group()‘Aa‘ >>> re.match(‘[A-Z][a-z]*‘,‘A‘).group()‘A‘
  • 匹配前一个字符1次或者无限次
 # 匹配前一个字符至少一次,如果一次都没有就会报错 >>> re.match(‘[A-Z][a-z]+‘,‘A‘).group()Traceback (most recent call last):  File "<stdin>", line 1, in <module>AttributeError: ‘NoneType‘ object has no attribute ‘group‘
 >>> re.match(‘[A-Z][a-z]+‘,‘Aa‘).group()‘Aa‘ >>> re.match(‘[A-Z][a-z]+‘,‘Aaaaaaa‘).group()‘Aaaaaaa‘
  • 匹配前一个字符0次或者1次
 >>> re.match(‘[A-Z][a-z]?‘,‘A‘).group()‘A‘ # 只匹配出一个a >>> re.match(‘[A-Z][a-z]?‘,‘Aaaa‘).group()‘Aa‘
  • 匹配前一个字符m次或者N次
 #匹配前一个字符至少5次 >>> re.match(‘\w{5}‘,‘asd234‘).group()‘asd23‘ # 匹配前面的字符6-10次 >>> re.match(‘\w{6,10}‘,‘asd234‘).group()‘asd234‘ # 超过的字符就匹配不出来 >>> re.match(‘\w{6,10}‘,‘asd2313qeadsd4‘).group()‘asd2313qea‘
  • 匹配模式变为贪婪模式
 >>> re.match(r‘[0-9][a-z]*‘,‘1bc‘).group()‘1bc‘ # *?匹配0次或者多次 >>> re.match(r‘[0-9][a-z]*?‘,‘1bc‘).group()‘1‘ # +?匹配一次或者多次,但是只匹配了一次 >>> re.match(r‘[0-9][a-z]+?‘,‘1bc‘).group()‘1b‘ # ??匹配0次或者一次 >>> re.match(r‘[0-9][a-z]??‘,‘1bc‘).group()‘1‘

贪婪匹配和非贪婪匹配

边界匹配

字符 匹配
^ 匹配字符串开头
$ 匹配字符串结尾
\A \Z 指定的字符串必须出现在开头/结尾
  • 匹配字符串开头
 # 必须以指定的字符串开头,结尾必须是@163.com >>> re.match(‘^[\w]{4,6}@163.com$‘,‘[email protected]‘).group()‘[email protected]‘
  • 匹配字符串结尾
 # 必须以.me结尾 >>> re.match(‘[\w]{1,20}.me$‘,‘ansheng.me‘).group()‘ansheng.me‘
  • 指定的字符串必须出现在开头/结尾
 >>> re.match(r‘\Awww[\w]*\me‘,‘wwwanshengme‘).group()‘wwwanshengme‘

正则表达式分组匹配

  • | 匹配左右任意一个表达式
 >>> re.match("www|me","www").group()‘www‘ >>> re.match("www|me","me").group()‘me‘
  • (ab) 括号中表达式作为一个分组
# 匹配163或者126的邮箱 >>> re.match(r‘[\w]{4,6}@(163|126).com‘,‘[email protected]‘).group()‘[email protected]‘ >>> re.match(r‘[\w]{4,6}@(163|126).com‘,‘[email protected]‘).group()‘[email protected]‘
  • (?P

    ) 分组起一个别名

 >>> re.search("(?P<zimu>abc)(?P<shuzi>123)","abc123").groups()(‘abc‘, ‘123‘)
  • 引用别名为name的分组匹配字符串

 >>> res.group("shuzi")‘123‘ >>> res.group("zimu")‘abc‘

re模块常用的方法

  • re.match()

语法格式:

match(pattern, string, flags=0)

释意:

Try to apply the pattern at the start of the string, returning a match object, or None if no match was found.

实例:

 # 从头开始匹配,匹配成功则返回匹配的对象 >>> re.match("abc","abc123def").group()‘abc‘ 
 # 从头开始匹配,如果没有匹配到对应的字符串就报错 >>> re.match("\d","abc123def").group()Traceback (most recent call last):  File "<stdin>", line 1, in <module>AttributeError: ‘NoneType‘ object has no attribute ‘group‘
  • re.search()

语法格式:

search(pattern, string, flags=0)

释意:

Scan through string looking for a match to the pattern, returning a match object, or None if no match was found.

实例:

 # 匹配整个字符串,匹配到第一个的时候就返回匹配到的对象 >>> re.search("\d","abc1123def").group()‘1‘
  • re.findall()

语法格式:

findall(pattern, string, flags=0)

释意:

Return a list of all non-overlapping matches in the string.

实例:

 # 匹配字符串所有的内容,把匹配到的字符串以列表的形式返回 >>> re.findall("\d","abc123def456")[‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘]
  • re.split

语法格式:

split(pattern, string, maxsplit=0)

释意:

Split the source string by the occurrences of the pattern, returning a list containing the resulting substrings.

实例:

 # 指定以数字进行分割,返回的是一个列表对象 >>> re.split("\d+","abc123def4+-*/56")[‘abc‘, ‘def‘, ‘+-*/‘, ‘‘] # 以多个字符进行分割 >>> re.split("[\d,]","a,b1c")[‘a‘, ‘b‘, ‘c‘]
  • re.sub()

语法格式:

sub(pattern, repl, string, count=0)

释意:

Return the string obtained by replacing the leftmost non-overlapping occurrences of the pattern in string by the replacement repl. repl can be either a string or a callable;
if a string, backslash escapes in it are processed. If it is a callable, it’s passed the match object and must return a replacement string to be used.

实例:

 # 把abc替换成def 
 >>> re.sub("abc","def","abc123abc")‘def123def‘ 
 # 只替换查找到的第一个字符串 
 >>> re.sub("abc","def","abc123abc",count=1)‘def123abc‘

实例

string方法包含了一百个可打印的ASCII字符,大小写字母、数字、空格以及标点符号

 >>> import string >>> printable = string.printable >>> printable‘0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\‘()*+,-./:;<=>[email protected][\\]^_`{|}~ \t\n\r\x0b\x0c‘
 >>> import re 
 # 定义的字符串 
 >>> source = ‘‘‘I wish I may, I wish I migth... Hava a dish of fish tonight.‘‘‘ 
 # 在字符串中检索wish 
 >>> re.findall(‘wish‘,source)[‘wish‘, ‘wish‘] 
 # 对源字符串任意位置查询wish或者fish 
 >>> re.findall(‘wish|fish‘,source)[‘wish‘, ‘wish‘, ‘fish‘] 
 # 从字符串开头开始匹配wish 
 >>> re.findall(‘^wish‘,source)    [] 
 # 从字符串开头匹配I wish 
 >>> re.findall(‘^I wish‘,source)[‘I wish‘] 
 # 从字符串结尾匹配fish 
 >>> re.findall(‘fish$‘,source)   [] 
 # 从字符串结尾匹配fish tonight. 
 >>> re.findall(‘fish tonight.$‘,source)[‘fish tonight.‘] 
 # 查询以w或f开头,后面紧跟着ish的匹配 
 >>> re.findall(‘[wf]ish‘,source)[‘wish‘, ‘wish‘, ‘fish‘] 
 # 查询以若干个w\s\h组合的匹配 
 >>> re.findall(‘[wsh]+‘,source) [‘w‘, ‘sh‘, ‘w‘, ‘sh‘, ‘h‘, ‘sh‘, ‘sh‘, ‘h‘] 
 # 查询以ght开头,后面紧跟着一个非数字和字母的匹配 
 >>> re.findall(‘ght\W‘,source)[‘ght.‘] 
 # 查询已以I开头,后面紧跟着wish的匹配 
 >>> re.findall(‘I (?=wish)‘,source)[‘I ‘, ‘I ‘] 
 # 最后查询以wish结尾,前面为I的匹配(I出现次数尽量少) 
 >>> re.findall(‘(?<=I) wish‘,source)[‘ wish‘, ‘ wish‘]
  • 匹配时不区分大小写
 >>> re.match(‘a‘,‘Abc‘,re.I).group()‘A‘
  • r 源字符串,转义,如果要转义要加两个\n
 >>> import re 
 >>> pa = re.compile(r‘yangwen‘) 
 >>> pa.match("yangwen.me")
 <_sre.SRE_Match object; span=(0, 7), match=‘yangwen‘> 
 >>> ma = pa.match("yangwen.me") 
 >>> ma
 <_sre.SRE_Match object; span=(0, 7), match=‘yangwen‘> 
 # 匹配到的值存到group内 
 >>> ma.group()‘yangwen‘ 
 # 返回字符串的所有位置 
 >>> ma.span()
 (0, 7) 
 # 匹配的字符串会被放到string中 
 >>> ma.string
 ‘yangwen.me‘ 
 # 实例放在re中 
 >>> ma.rere.compile(‘yangwen‘)
时间: 2024-08-08 09:40:44

Python正则表达式re模块的相关文章

python 正则表达式 re模块基础

简介 正则表达式(regular expression)是可以匹配文本片段的模式.最简单的正则表达式就是普通字符串,可以匹配其自身.比如,正则表达式 'hello' 可以匹配字符串 'hello'. 要注意的是,正则表达式并不是一个程序,而是用于处理字符串的一种模式,如果你想用它来处理字符串,就必须使用支持正则表达式的工具,比如 Linux 中的 awk, sed, grep,或者编程语言 Perl, Python, Java 等等. 正则表达式有多种不同的风格,下表列出了适用于 Python

python 正则表达式re模块

#####################总结##############    优点:  灵活, 功能性强, 逻辑性强.               缺点:  上手难,旦上手, 会爱上这个东西       工具: 各大文本编辑器一般都有正则匹配功能. 我们也可以去 http://tool.chinaz.com/regex/进行在线测试. 正则表达式由普通字符和元字符组成,普通字符包含大小写字母, 数字,在匹配普通字符的时候我们直接写就可以了 (1) 字符组  字符组很简单用[]括起来,在[]中

Python 正则表达式re模块使用

re是Python的正则表达式模块,在此记录实际开发过程中的使用. 正则表达式的最佳实践是使用re.compile方法编译后使用,效率会更好 1.re.search() example: TS 1423031065.017865025 2015-02-04 14:24:25  14:24:25 up 82 days, 23:51,  2 users,  load average: 0.02, 0.03, 0.10 匹配 TS开头跟一个空格后跟若干个数字. >>> import re &g

python正则表达式re模块的简单使用

正则表达式无论是提取数据还是在做爬虫的时候都会经常使用,下面说下re模块的常见使用. re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none. 函数语法: re.match(pattern, string, flags=0) import re # todo re.match的用法,从字符串第一个开始匹配 content = 'Hello 123 4567 World_this a regex demo' # ^todo 匹配字符串开头,

python正则表达式 ---- re模块

1.正则表达式 正则就是使用一些具有特殊含义的符号组合到一起,来描述字符串或字符的方法. 2.常用的正则匹配模式 import reprint(re.findall('\w','hello_ | egon 123')) #匹配字母数字下划线 print(re.findall('\W','hello_ | egon 123')) #与小w相反 匹配非数字字符下划线 print(re.findall('\s','hello_ | egon 123 \n \t')) #匹配任意空白字符如 [ \t,\

Python 正则表达式_re模块_使用compile加速

使用compile加速 compile( rule [,flag] ) 将正则规则编译成一个Pattern对象,以供接下来使用. 第一个参数是规则式,第二个参数是规则选项. 返回一个Pattern对象 直接使用findall ( rule , target )的方式来匹配字符串,一次两次没什么,如果是多次使用的话,由于正则引擎每次都要把规则解释一遍,而规则的解释又是相当费时间的,所以这样的效率就很低了.如果要多次使用同一规则来进行匹配的话,可以使用re.compile函数来将规则预编译,使用编译

7.python之正则表达式re模块

一.re模块的常用方法: re.findall() 用于返回一个字符串中,所有能被正则表达式所匹配到的字符串,以列表的方式返回. 用法re.findall(正则表达式,字符串). s1 = "sadjhjafdsajkhjsdaysadsadduayu" 比如说,想要从上面这一长串字符串中,匹配出a后面有一个任一字符在紧接着一个字母u的字符串. print re.findall('a.u',s1) >>>['ayu'] re.finditer()作用和findall一

python之路 正则表达式,模块导入的方法,hashlib加密

一.正则表达式re python中re模块提供了正则表达式相关操作 字符: . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d 匹配数字 \b 匹配单词的开始或结束 ^ 匹配字符串的开始 $ 匹配字符串的结束 次数: * 重复零次或更多次 + 重复一次或更多次 ? 重复零次或一次 {n} 重复n次 {n,} 重复n次或更多次 {n,m} 重复n到m次 模式 描述 ^ 匹配字符串的开头 $ 匹配字符串的末尾. . 匹配任意字符,除了换行符,当re.DO

Python中的正则表达式-re模块

有时候我们需要模糊查找我们需要的字符串等值,这个时候需要用到正则表达式. 正则表达式的使用,在python中需要引入re包 import re 1.首先了解下正则表达式的常用语法 --单个字符 . 任意的一个字符 a|b 字符a或字符b [afg] a或者f或者g的一个字符 [0-4] 0-4范围内的一个字符 [a-f] a-f范围内的一个字符 [^a] 不是a的一个字符 \s 一个空格 \S 一个非空格 \d [0-9],即0-9的任意字符 \D [^0-9],即非0-9的任意字符 \w [0