Day25:正则表达式

一、正则表达式(re模块)

就其本质而言,正则表达式(或 RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。

字符匹配(普通字符,元字符):

1 普通字符:大多数字符和字母都会和自身匹配
              >>> re.findall(‘alvin‘,‘yuanaleSxalexwupeiqi‘)
                      [‘alvin‘]

2 元字符:. ^ $ * + ? { } [ ] | ( ) \

3常用方式

re.findall  返回所有的匹配项

re.search  只匹配一项符合规则的元素,返回对象,.group查看

re.match  只匹配字符串开始的位置,返回对象,.group查看

1、元字符

. ^ $

  .匹配除了换行符(\n)外的任意字符

  ^匹配字符串开头

  $匹配字符串结尾

import re
print(re.findall(‘李.‘,‘李爽\nalex\n李四\negon\nalvin\n李二‘))
#运行结果
[‘李爽‘, ‘李四‘, ‘李二‘]

ret=re.search(‘李.‘,‘李爽\nalex\n李四\negon\nalvin\n李二‘)
print(ret,ret.group(),ret.span())
#运行结果
<_sre.SRE_Match object; span=(0, 2), match=‘李爽‘> 李爽 (0, 2)

ret=re.match(‘李.‘,‘李爽\nalex\n李四\negon\nalvin\n李二‘)
print(ret,ret.group(),ret.span())
#运行结果
<_sre.SRE_Match object; span=(0, 2), match=‘李爽‘> 李爽 (0, 2)

print(re.findall(‘^李.‘,‘李爽\nalex\n李四\negon\nalvin\n李二‘))
#运行结果
[‘李爽‘]

print(re.findall(‘李.$‘,‘李爽\nalex\n李四\negon\nalvin\n李二‘))
#运行结果
[‘李二‘]

* + ? { }

  *匹配前一个字符0个或任意多个

  +匹配前一个字符1个或任意多个

  ?匹配前一个字符0个或任意1个

  {}匹配前一个字符定义个数个

import re
print(re.findall(‘李.*‘,‘李杰\nalex\n李莲英\negon\nalvin\n李二棍子‘))
#运行结果
[‘李杰‘, ‘李莲英‘, ‘李二棍子‘]

print(re.findall(‘李.+‘,‘李杰\nalex\n李莲英\negon\nalvin\n李二棍子‘))
#运行结果
[‘李杰‘, ‘李莲英‘, ‘李二棍子‘]

print(re.findall(‘李.{1,2}\n‘,‘李杰\nalex\n李莲英\negon\nalvin\n李二棍子‘))
#运行结果
[‘李杰\n‘, ‘李莲英\n‘]

print(re.findall(‘\d+\.?\d*‘,‘12.45,34,0.05,109‘))  # 匹配一个数字包括整型和浮点型
#运行结果
[‘12.45‘, ‘34‘, ‘0.05‘, ‘109‘]

注意:前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配

print(re.findall(‘131\d+?‘,‘1312312312‘))
#运行结果
[‘1312‘]

转义符\

1、反斜杠后边跟元字符去除特殊功能,比如\.

2、反斜杠后边跟普通字符实现特殊功能,比如\d

\d      匹配任何十进制数;          它相当于类 [0-9]。
\D      匹配任何非数字字符;        它相当于类 [^0-9]。
\s      匹配任何空白字符;          它相当于类 [ \t\n\r\f\v]。
\S      匹配任何非空白字符;        它相当于类 [^ \t\n\r\f\v]。
\w      匹配任何字母数字字符;     它相当于类 [a-zA-Z0-9_]。
\W      匹配任何非字母数字字符;   它相当于类 [^a-zA-Z0-9_]
\b      匹配一个特殊字符边界,比如空格 ,&,#等 
print(re.findall(r‘I\b‘,‘I am LIST‘))
#运行结果
[‘I‘]
#匹配abc\le”中的‘c\l’:
print(re.findall(‘c\\\l‘,‘abc\le‘))
print(re.findall(‘c\\\\l‘,‘abc\le‘))
print(re.findall(r‘c\\l‘,‘abc\le‘))
#运行结果
[‘c\\l‘]

print(re.findall(r‘c\\b‘,r‘abc\be‘))
#运行结果
[‘c\\b‘] 

分组()

print(re.findall(r‘(ad)+‘, ‘add,adddd‘))  #只返回元组的内容
#运行结果
[‘ad‘, ‘ad‘]

ret=re.search(‘(?P<id>\d{2})/(?P<name>\w{3})‘,‘23/com‘)  #?P<‘变量名‘>进行命名
print(ret.group(),ret.group(1),ret.group(2))
print(ret.group(‘id‘))
#运行结果
23/com    23    com
23

或|

print(re.findall(‘ab|\d‘,‘rabhdg8sd‘))
#运行结果
[‘ab‘, ‘8‘]

字符集[]

  [ab]匹配字符集中的一个字符

  -  \  ^ 在[]中有特殊意义

print(re.findall(‘a[bc]d‘,‘abd‘))
print(re.findall(‘[abc]‘,‘abc‘))
print(re.findall(‘[.*+]‘,‘a.bc+‘))
#运行结果
[‘abd‘]
[‘a‘, ‘b‘, ‘c‘]
[‘.‘, ‘+‘]

#在字符集里有功能的符号: - ^ \
print(re.findall(‘[1-9]‘,‘45dha3‘))
print(re.findall(‘[^ab]‘,‘45bdha3‘))
print(re.findall(‘[\d]‘,‘45bdha3‘))
#运行结果
[‘4‘, ‘5‘, ‘3‘]
[‘4‘, ‘5‘, ‘d‘, ‘h‘, ‘3‘]
[‘4‘, ‘5‘, ‘3‘]

2、贪婪匹配

贪婪匹配:在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配

string pattern1 = @"a.*c";   // greedy match
Regex regex = new Regex(pattern1);
regex.Match("abcabc"); // return "abcabc"
非贪婪匹配:在满足匹配时,匹配尽可能短的字符串,使用?来表示非贪婪匹配

string pattern1 = @"a.*?c";   // non-greedy match
Regex regex = new Regex(pattern1);
regex.Match("abcabc"); // return "abc"

几个常用的非贪婪匹配Pattern

*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

.*?的用法:

--------------------------------

. 是任意字符
* 是取 0 至 无限长度
? 是非贪婪模式。
何在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在:
.*?a

就是取前面任意长度的字符,到底一个 a 出现

3、re模块下的常用方法

import re

re.findall(‘a‘,‘alvin yuan‘)    #返回所有满足匹配条件的结果,放在列表里

re.search(‘a‘,‘alvin yuan‘).group()  

      #函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
      # 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。

re.match(‘a‘,‘abc‘).group()     #同search,不过尽在字符串开始处进行匹配

ret=re.split(‘[ab]‘,‘abcd‘)     #先按‘a‘分割得到‘‘和‘bcd‘,在对‘‘和‘bcd‘分别按‘b‘分割

print(ret)#[‘‘, ‘‘, ‘cd‘]

ret=re.sub(‘\d‘,‘abc‘,‘alvin5yuan6‘,1)

ret=re.subn(‘\d‘,‘abc‘,‘alvin5yuan6‘)

obj=re.compile(‘\d{3}‘)
ret=obj.search(‘abc123eeee‘)
print(ret.group())#123

import re
ret=re.finditer(‘\d‘,‘ds3sy4784a‘)
print(ret)        #<callable_iterator object at 0x10195f940>

print(next(ret).group())
print(next(ret).group())

注意:

findall的优先级查询:取消优先级(?:)

import re

ret=re.findall(‘www.(baidu|oldboy).com‘,‘www.oldboy.com‘)
print(ret)#[‘oldboy‘]     这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可

ret=re.findall(‘www.(?:baidu|oldboy).com‘,‘www.oldboy.com‘)
print(ret)#[‘www.oldboy.com‘]
时间: 2024-10-05 20:47:41

Day25:正则表达式的相关文章

Java基础---正则表达式

正则表达式 一.概述 1. 概念:符合一定规则的表达式. 2. 作用:用于专门操作字符串. 3. 特点:用于一些特定的符号来表示一些代码操作,这样可以简化书写.所以学习正则表达式,就是在学习一些特殊符号的使用. 4. 好处:可以简化对字符串的复杂操作. 5. 弊端:符合定义越多,正则越长,阅读性越差. 二.常见符号 说明:X表示字符X或者匹配的规则. 1.字符 x                  字符 x \\                 反斜线字符 \t                 

黑马程序员——java基础---GUI、正则表达式

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.GUI概述 GUI(GraphicalUser Interface): 又称图形用户界面,是计算机用户与计算机交互的一种方式. 用户与计算机交互的两种方式: 1.GUI(Graphical User Interface):图形用户接口,用图形方式,来显示计算机操作界面,方便直观. 2.CLI(Command LineUser Interface):命令行用户接口,即常见的Dos命令行操作,

黑马程序员——【Java基础】——正则表达式

---------- android培训.java培训.期待与您交流! ---------- 一.概述 1. 概念:符合一定规则的表达式. 2. 作用:用于专门操作字符串. 3. 特点:用一些特定的符号来表示一些代码操作,这样可以简化书写. 4. 好处:可以简化对字符串的复杂操作. 5. 弊端:符合定义越多,正则越长,阅读性越差. 二.常见规则 1.字符类 [abc]:表示a.b或 c [^abc]:表示任何字符,除了 a.b或 c [a-zA-Z]:表示a到 z或 A 到 Z [a-d[m-p

【Linux系列】【基础版】第四章 Shell基础之正则表达式

4. Shell基础之正则表达式     4.1 正则就是一串有规律的字符串         4.1 grep              4.1.1 格式: grep [-cinrvABC] 'word' filename             4.1.2 -c //count,表示行数             4.1.3 -i //不区分大小写             4.1.4 -n  //显示行号             4.1.5 -r  //遍历所有子目录             4

正则表达式中的逆向思维

人们的正常思维都是顺向的,那么逆向思维呢,特别是初学正则表达式的同学们,好不容易掌握了正则表达式的用法,再突然要你用逆向思维做题,会有很多不适应: 这里拿三道题,来做简单介绍: 1.经典例题取IP: [[email protected] ~]# ifconfig eth0|sed -nr '2s#^[^0-9]+(.*)[a-Z]{5,}.*#\1#gp' 10.0.0.200 2.调换/etc/passwd中最后一列和第一列的位置: [[email protected] ~]# head /p

JAVA正则表达式:Pattern类与Matcher类详解(转)

java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式. Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查. 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作

前端学PHP之正则表达式函数

前面的话 正则表达式不能独立使用,它只是一种用来定义字符串的规则模式,必须在相应的正则表达式函数中应用,才能实现对字符串的匹配.查找.替换及分割等操作.前面介绍了正则表达式的基础语法,本文将详细介绍正则表达式函数 匹配与查找 [preg_match()] preg_match()函数用来执行一个正则表达式匹配,搜索subject与pattern给定的正则表达式的一个匹配.返回pattern的匹配次数.它的值将是0次(不匹配)或1次,因为preg_match()在第一次匹配后将会停止搜索.preg

正则表达式

grep命令和正则表达式 一. 正则 : 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑.给定一个正则表达式和另一个字符串,我们可以达到如下的目的:1. 给定的字符串是否符合正则表达式的过滤逻辑(称作"匹配"):2. 可以通过正则表达式,从字符串中获取我们想要的特定部分. 正则表达式和通配符一样,也是一组特殊符号,通配符是由sh

java中的正则表达式

正则表达式 : 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串.将匹配的子串替换或者从某个串中取出符合某个条件的子串等. 一些字符所代表的意思: \        将下一字符标记为特殊字符.文本.反向引用或八进制转义符^       匹配输入字符串开始的位置$       匹配输入字符串结尾的位置.        匹配任何单个字符\s      空白(空格符.换行符.回车符.制表符)\S     非空白[]