博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python使用re模块实现正则表达式操作
阅读量:4695 次
发布时间:2019-06-09

本文共 4745 字,大约阅读时间需要 15 分钟。

Python提供了re模块,用于实现正则表达式的操作。在实现时,可以使用re模块提供的方法(如search()match()findall()等)进行字符串处理,也可以先使用re模块的compile()方法将模式字符串转换为正则表达式对象,然后再使用该正则表达式对象的相关方法来操作字符串。

re.match(pattern, string, [flags])
  • pattern:表示模式字符串,由要匹配的正则表达式转换而来。
  • string:表示要匹配的字符串。
  • flags:可选参数,表示标志位,用于控制匹配方式,如是否区分子母大小写。

常用标志:

标志 说明
A 或 ASCII 对于\w、\W、\b、\B、\d、\D、\s和\S只进行ASCII匹配(仅适用于Python3.x)
I 或 IGNORECASE 执行不区分子母大小写的匹配
M 或 MULTILINE 将^和$用于包括整个字符串的开始和结尾的每一行(默认情况下,仅适用于整个字符串的开始和结尾处)
S 或 DOTALL 使用(.)字符匹配所有字符,包括换行符
X 或 VERBOSE 忽略模式字符串中未转义的空格和注释

示例代码:

匹配字符串是否以“mr_”开头,不区分子母大小写:

import repattern = r'mr_\w+'                      # 模式字符串string = 'MR_SHOP mr_shop'               # 要匹配的字符串match = re.match(pattern, string, re.I)  # 匹配字符串,不区分大小写print(match)                             # 输出匹配结果string = '项目名称MR_SHOP mr_shop'match = re.match(pattern, string, re.I)  # 匹配字符串,不区分大小写print(match)                             # 输出匹配结果执行结果:	
None

re模块中常用函数

compile()

编译正则表达式模式,返回一个对象的模式。(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率。)

re.compile(pattern,flags=0)
  • pattern: 编译时用的表达式字符串。

  • flags:编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,多行匹配等。常用的flags有:

标志 含义
re.S(DOTALL) 使.匹配包括换行在内的所有字符
re.I(IGNORECASE) 使匹配对大小写不敏感
re.L(LOCALE) 做本地化识别(locale-aware)匹配,法语等
re.M(MULTILINE) 多行匹配,影响^和$
re.X(VERBOSE) 该标志通过给予更灵活的格式以便将正则表达式写得更易于理解
re.U 根据Unicode字符集解析字符,这个标志影响\w,\W,\b,\B

示例代码:

import rett = "Tina is a good girl, she is cool, clever, and so on..."rr = re.compile(r'\w*oo\w*')print(rr.findall(tt))   #查找所有包含'oo'的单词    执行结果:['good', 'cool']

match()

决定RE是否在字符串刚开始的位置匹配。//注:这个方法并不是完全匹配。当pattern结束时若string还有剩余字符,仍然视为成功。想要完全匹配,可以在表达式末尾加上边界匹配符’$’

re.match(pattern, string, flags=0)
print(re.match('com','comwww.runcomoob').group())print(re.match('com','Comwww.runcomoob',re.I).group())执行结果:    com    com

search()

re.search(pattern, string, flags=0)

re.search函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None。

print(re.search('\dcom','www.4comrunoob.5com').group())执行结果:    4com

注意:match和search一旦匹配成功,就是一个match object对象,而match object对象有以下方法:

  • group() 返回被 RE 匹配的字符串
  • start() 返回匹配开始的位置
  • end() 返回匹配结束的位置
  • span() 返回一个元组包含匹配 (开始,结束) 的位置
  • group() 返回re整体匹配的字符串,可以一次输入多个组号,对应组号匹配的字符串。
a. group()返回re整体匹配的字符串,b. group (n,m) 返回组号为n,m所匹配的字符串,如果组号不存在,则返回indexError异常c.groups()groups() 方法返回一个包含正则表达式中所有小组字符串的元组,从 1 到所含的小组号,通常groups()不需要参数,返回一个元组,元组中的元就是正则表达式中定义的组。

示例代码:

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

group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。

findall()

re.findall遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表。

示例代码:

p = re.compile(r'\d+')print(p.findall('o1n2m3k4'))执行结果:    ['1', '2', '3', '4']
import rett = "Tina is a good girl, she is cool, clever, and so on..."rr = re.compile(r'\w*oo\w*')print(rr.findall(tt))print(re.findall(r'(\w)*oo(\w)',tt))#()表示子表达式 执行结果:    ['good', 'cool']    [('g', 'd'), ('c', 'l')]

finditer()

搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。找到 RE 匹配的所有子串,并把它们作为一个迭代器返回。

re.finditer(pattern, string, flags=0)

示例代码:

iter = re.finditer(r'\d+','12 drumm44ers drumming, 11 ... 10 ...')for i in iter:    print(i)    print(i.group())    print(i.span())    执行结果:<_sre.SRE_Match object; span=(0, 2), match='12'>12(0, 2)<_sre.SRE_Match object; span=(8, 10), match='44'>44(8, 10)<_sre.SRE_Match object; span=(24, 26), match='11'>11(24, 26)<_sre.SRE_Match object; span=(31, 33), match='10'>10(31, 33)

split()

按照能够匹配的子串将string分割后返回列表。

可以使用re.split来分割字符串,如:re.split(r’\s+’, text);将字符串按空格分割成一个单词列表。

re.split(pattern, string[, maxsplit])

maxsplit用于指定最大分割次数,不指定将全部分割。

示例代码:

print(re.split('\d+','one1two2three3four4five5'))执行结果:    ['one', 'two', 'three', 'four', 'five', '']

sub()

使用re替换string中每一个匹配的子串后返回替换后的字符串。

re.sub(pattern, repl, string, count)

示例代码:

import redef filterchar(string):    pattern = r'(黑客)|(抓包)'  # 要替换的字符    sub =re.sub(pattern, 'xxx', string)  # 如果string中出现pattern中所定义的值,将其替换成'xxx'    print(sub)filterchar('我喜欢黑客技术,他们经常抓包')执行结果:	我喜欢xxx技术,他们经常xxx

re.sub还允许使用函数对匹配项的替换进行复杂的处理。

示例代码:

re.sub(r'\s', lambda m: '[' + m.group(0) + ']', text, 0);将字符串中的空格' '替换为'[ ]'。

示例代码:

import retext = "JGood is a handsome boy, he is cool, clever, and so on..."print(re.sub(r'\s+', lambda m:'['+m.group(0)+']', text,0))执行结果如下:JGood[ ]is[ ]a[ ]handsome[ ]boy,[ ]he[ ]is[ ]cool,[ ]clever,[ ]and[ ]so[ ]on...

subn()

返回替换次数

subn(pattern, repl, string, count=0, flags=0)

示例代码:

print(re.subn('[1-2]','A','123456abcdef'))print(re.sub("g.t","have",'I get A,  I got B ,I gut C'))print(re.subn("g.t","have",'I get A,  I got B ,I gut C'))执行结果:    ('AA3456abcdef', 2)    I have A,  I have B ,I have C    ('I have A,  I have B ,I have C', 3)

转载于:https://www.cnblogs.com/weibgg/p/10787007.html

你可能感兴趣的文章
Copy code from eclipse to word, save syntax.
查看>>
arguments.callee的作用及替换方案
查看>>
23 Java学习之RandomAccessFile
查看>>
P2709 小B的询问
查看>>
PHP echo 和 print 语句
查看>>
第一讲 一个简单的Qt程序分析
查看>>
Centos 6.5下的OPENJDK卸载和SUN的JDK安装、环境变量配置
查看>>
poj 1979 Red and Black(dfs)
查看>>
【.Net基础03】HttpWebRequest模拟浏览器登陆
查看>>
zTree async 动态参数处理
查看>>
Oracle学习之常见错误整理
查看>>
数据库插入数据乱码问题
查看>>
altium annotate 选项设置 complete existing packages
查看>>
【模式识别与机器学习】——SVM举例
查看>>
【转】IT名企面试:微软笔试题(1)
查看>>
IO流入门-第十章-DataInputStream_DataOutputStream
查看>>
DRF的分页
查看>>
Mysql 模糊匹配(字符串str中是否包含子字符串substr)
查看>>
python:open/文件操作
查看>>
流程控制 Day06
查看>>