目录
re模块
首页 后端开发 Python教程 python的正则表达式的操作--re模块

python的正则表达式的操作--re模块

Jun 20, 2017 pm 04:54 PM
python 开发 模块 正则

re模块

序言:

re模块用于对python的正则表达式的操作

'.'     默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
'^'     匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
'$'     匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
'*'     匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac")  结果为['abb', 'ab', 'a']
'+'     匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
'?'     匹配前一个字符1次或0次
'{m}'   匹配前一个字符m次
'{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
'|'     匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
'(...)' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c
'[a-z]' 匹配a到z任意一个字符
'[^()]' 匹配除()以外的任意一个字符
 
r' '    转义引号里的字符 针对\字符  详情查看⑦
'\A'    只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的
'\Z'    匹配字符结尾,同$
'\d'    匹配数字0-9
'\D'    匹配非数字
'\w'    匹配[A-Za-z0-9]
'\W'    匹配非[A-Za-z0-9]
'\s'    匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'
   
&#39;(?P<name>...)&#39; 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city")
结果{&#39;province&#39;: &#39;3714&#39;, &#39;city&#39;: &#39;81&#39;, &#39;birthday&#39;: &#39;1993&#39;}
re.IGNORECASE  忽略大小写 re.search(&#39;(\A|\s)red(\s+|$)&#39;,i,re.IGNORECASE)
登录后复制

标志位即模式修正符,不改变正则表达式的情况下,通过模式修正符改变正则表达式的含义,从而实现一些匹配结果的调整等功能: 

# flags
I = IGNORECASE = sre_compile.SRE_FLAG_IGNORECASE # ignore case  匹配时忽略大小写
L = LOCALE = sre_compile.SRE_FLAG_LOCALE # assume current 8-bit locale   做本地化识别匹配
U = UNICODE = sre_compile.SRE_FLAG_UNICODE # assume unicode locale       根据Unicode字符及解析字符
M = MULTILINE = sre_compile.SRE_FLAG_MULTILINE # make anchors look for newline   多行匹配
S = DOTALL = sre_compile.SRE_FLAG_DOTALL # make dot match newline      让.匹配包括换行符,即用了该模式修正后,"."匹配就可以匹配任意的字符了
X = VERBOSE = sre_compile.SRE_FLAG_VERBOSE # ignore whitespace and comments
登录后复制

贪婪模式、懒惰模式:

import re

result1 =  re.search("p.*y","abcdfphp435pythony_py")   # 贪婪模式
print(result1)
# <_sre.SRE_Match object; span=(5, 21), match=&#39;php435pythony_py&#39;>

result2 =  re.search("p.*?y","abcdfphp435pythony_py")   # 懒惰模式
print(result2)
# <_sre.SRE_Match object; span=(5, 13), match=&#39;php435py&#39;>
登录后复制

  

match:

从起始位置开始根据模型去字符串中匹配指定内容:

#match
import re                               

obj = re.match(&#39;\d+&#39;, &#39;123uua123sf&#39;)       #从第一个字符开始匹配一个到多个数字
print(obj)                                
#<_sre.SRE_Match object; span=(0, 3), match=&#39;123&#39;>

if obj:                                   #如果有匹配到字符则执行,为空不执行
    print(obj.group())                    #打印匹配到的内容
#123
登录后复制

匹配ip地址:

import re

ip = &#39;255.255.255.253&#39;
result=re.match(r&#39;^([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.&#39;
                r&#39;([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])$&#39;,ip)
print(result)
# <_sre.SRE_Match object; span=(0, 15), match=&#39;255.255.255.253&#39;>
登录后复制

search:

根据模型去字符串中匹配指定内容(不一定是最开始位置),匹配最前

#search
import  re
obj = re.search(&#39;\d+&#39;, &#39;a123uu234asf&#39;)     #从数字开始匹配一个到多个数字
print(obj)
#<_sre.SRE_Match object; span=(1, 4), match=&#39;123&#39;>

if obj:                                   #如果有匹配到字符则执行,为空不执行
    print(obj.group())                    #打印匹配到的内容
#123


import  re
obj = re.search(&#39;\([^()]+\)&#39;, &#39;sdds(a1fwewe2(3uusfdsf2)34as)f&#39;)     #匹配最里面()的内容
print(obj)
#<_sre.SRE_Match object; span=(13, 24), match=&#39;(3uusfdsf2)&#39;>

if obj:                                   #如果有匹配到字符则执行,为空不执行
    print(obj.group())                    #打印匹配到的内容
#(3uusfdsf2)
登录后复制

group与groups的区别:

#group与groups的区别
import  re
a = "123abc456"
b = re.search("([0-9]*)([a-z]*)([0-9]*)", a)
print(b)
#<_sre.SRE_Match object; span=(0, 9), match=&#39;123abc456&#39;>
print(b.group())
#123abc456
print(b.group(0))
#123abc456
print(b.group(1))
#123
print(b.group(2))
#abc
print(b.group(3))
#456
print(b.groups())
#(&#39;123&#39;, &#39;abc&#39;, &#39;456&#39;)
登录后复制

findall:

上述两中方式均用于匹配单值,即:只能匹配字符串中的一个,如果想要匹配到字符串中所有符合条件的元素,则需要使用 findall;findall没有group用法

#findall
import  re
obj = re.findall(&#39;\d+&#39;, &#39;a123uu234asf&#39;)     #匹配多个

if obj:                                   #如果有匹配到字符则执行,为空不执行
    print(obj)                             #生成的内容为列表
#[&#39;123&#39;, &#39;234&#39;]
登录后复制

sub:

用于替换匹配的字符串(pattern, repl, string, count=0, flags=0)

#sub
import  re

content = "123abc456"
new_content = re.sub(&#39;\d+&#39;, &#39;ABC&#39;, content)
print(new_content)
#ABCabcABC
登录后复制

split:

根据指定匹配进行分组(pattern, string, maxsplit=0, flags=0)

#split
import  re

content = "1 - 2 * ((60-30+1*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2) )"
new_content = re.split(&#39;\*&#39;, content)       #用*进行分割,分割为列表
print(new_content)
#[&#39;1 - 2 &#39;, &#39; ((60-30+1&#39;, &#39;(9-2&#39;, &#39;5/3+7/3&#39;, &#39;99/4&#39;, &#39;2998+10&#39;, &#39;568/14))-(-4&#39;, &#39;3)/(16-3&#39;, &#39;2) )&#39;]

content = "&#39;1 - 2 * ((60-30+1*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2) )&#39;"
new_content = re.split(&#39;[\+\-\*\/]+&#39;, content)
# new_content = re.split(&#39;\*&#39;, content, 1)
print(new_content)
#["&#39;1 ", &#39; 2 &#39;, &#39; ((60&#39;, &#39;30&#39;, &#39;1&#39;, &#39;(9&#39;, &#39;2&#39;, &#39;5&#39;, &#39;3&#39;, &#39;7&#39;, &#39;3&#39;, &#39;99&#39;, &#39;4&#39;, &#39;2998&#39;, &#39;10&#39;, &#39;568&#39;, &#39;14))&#39;,
#  &#39;(&#39;, &#39;4&#39;, &#39;3)&#39;, &#39;(16&#39;, &#39;3&#39;, "2) )&#39;"]

inpp = &#39;1-2*((60-30 +(-40-5)*(9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))&#39;
inpp = re.sub(&#39;\s*&#39;,&#39;&#39;,inpp)                #把空白字符去掉
print(inpp)
new_content = re.split(&#39;\(([\+\-\*\/]?\d+[\+\-\*\/]?\d+){1}\)&#39;, inpp, 1)
print(new_content)
#[&#39;1-2*((60-30+&#39;, &#39;-40-5&#39;, &#39;*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))&#39;]
登录后复制

补充r' ' 转义:

fdfdsfds\fds
sfdsfds& @$
登录后复制
lzl.py

首先要清楚,程序读取文件里的\字符时,添加到列表里面的是\\

import re,sys
li = []
with open(&#39;lzl.txt&#39;,&#39;r&#39;,encoding="utf-8") as file:
    for line in file:
        li.append(line)
print(li)                   # 注意:文件中的单斜杠,读出来后会变成双斜杠
# [&#39;fdfdsfds\\fds\n&#39;, &#39;sfdsfds& @$&#39;]
print(li[0])                # print打印的时候还是单斜杠
# fdfdsfds\fds
登录后复制

r字符的意义,对字符\进行转义\只做为字符出现:

import re,sys
li = []
with open(&#39;lzl.txt&#39;,&#39;r&#39;,encoding="utf-8") as file:
    for line in file:
        print(re.findall(r&#39;s\\f&#39;, line))  #第一种方式匹配
        # print(re.findall(&#39;\\\\&#39;, line))  #第二种方式匹配
        li.append(line)
print(li)                   # 注意:文件中的单斜杠,读出来后会变成双斜杠
# [&#39;s\\f&#39;]
# []
# [&#39;fdfdsfds\\fds\n&#39;, &#39;sfdsfds& @$&#39;]
登录后复制

补充:看完下面的代码你可能更懵了

import re
re.findall(r&#39;\\&#39;, line)  # 正则中只能这样写 不能写成 r&#39;\&#39; 这样
print(r&#39;\\&#39;)            # 只能这样写 不能写成r&#39;\&#39; \只能是双数
# \\        结果
# 如果想值打印单个\ 写成如下
print(&#39;\\&#39;)             # 只能是双数
# \         结果
登录后复制

总结:文件中的单斜杠\,读出到程序中时是双斜杠\\,print打印出来是单斜杠\;正则匹配文件但斜杠\时,用r'\\'双斜杠去匹配,或者不用r直接用'\\\\'四个斜杠去匹配

compile函数:

说明:

Python通过re模块提供对正则表达式的支持。使用re的一般步骤是先使用re.compile()函数,将正则表达式的字符串形式编译为Pattern实例,
然后使用Pattern实例处理文本并获得匹配结果(一个Match实例),最后使用Match实例获得信息,进行其他的操作
登录后复制

举一个简单的例子,在寻找一个字符串中所有的英文字符:

import re
pattern = re.compile(&#39;[a-zA-Z]&#39;)
result = pattern.findall(&#39;as3SiOPdj#@23awe&#39;)
print(result)
# [&#39;a&#39;, &#39;s&#39;, &#39;S&#39;, &#39;i&#39;, &#39;O&#39;, &#39;P&#39;, &#39;d&#39;, &#39;j&#39;, &#39;a&#39;, &#39;w&#39;, &#39;e&#39;]
登录后复制

匹配IP地址(255.255.255.255):  

import re

pattern = re.compile(r&#39;^(([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.){3}([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])$&#39;)
result = pattern.match(&#39;255.255.255.255&#39;)
print(result)
# <_sre.SRE_Match object; span=(0, 15), match=&#39;255.255.255.255&#39;>
登录后复制

 

以上是python的正则表达式的操作--re模块的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

PHP和Python:解释了不同的范例 PHP和Python:解释了不同的范例 Apr 18, 2025 am 12:26 AM

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

在PHP和Python之间进行选择:指南 在PHP和Python之间进行选择:指南 Apr 18, 2025 am 12:24 AM

PHP适合网页开发和快速原型开发,Python适用于数据科学和机器学习。1.PHP用于动态网页开发,语法简单,适合快速开发。2.Python语法简洁,适用于多领域,库生态系统强大。

visual studio code 可以用于 python 吗 visual studio code 可以用于 python 吗 Apr 15, 2025 pm 08:18 PM

VS Code 可用于编写 Python,并提供许多功能,使其成为开发 Python 应用程序的理想工具。它允许用户:安装 Python 扩展,以获得代码补全、语法高亮和调试等功能。使用调试器逐步跟踪代码,查找和修复错误。集成 Git,进行版本控制。使用代码格式化工具,保持代码一致性。使用 Linting 工具,提前发现潜在问题。

vs code 可以在 Windows 8 中运行吗 vs code 可以在 Windows 8 中运行吗 Apr 15, 2025 pm 07:24 PM

VS Code可以在Windows 8上运行,但体验可能不佳。首先确保系统已更新到最新补丁,然后下载与系统架构匹配的VS Code安装包,按照提示安装。安装后,注意某些扩展程序可能与Windows 8不兼容,需要寻找替代扩展或在虚拟机中使用更新的Windows系统。安装必要的扩展,检查是否正常工作。尽管VS Code在Windows 8上可行,但建议升级到更新的Windows系统以获得更好的开发体验和安全保障。

vscode 扩展是否是恶意的 vscode 扩展是否是恶意的 Apr 15, 2025 pm 07:57 PM

VS Code 扩展存在恶意风险,例如隐藏恶意代码、利用漏洞、伪装成合法扩展。识别恶意扩展的方法包括:检查发布者、阅读评论、检查代码、谨慎安装。安全措施还包括:安全意识、良好习惯、定期更新和杀毒软件。

PHP和Python:深入了解他们的历史 PHP和Python:深入了解他们的历史 Apr 18, 2025 am 12:25 AM

PHP起源于1994年,由RasmusLerdorf开发,最初用于跟踪网站访问者,逐渐演变为服务器端脚本语言,广泛应用于网页开发。Python由GuidovanRossum于1980年代末开发,1991年首次发布,强调代码可读性和简洁性,适用于科学计算、数据分析等领域。

vscode怎么在终端运行程序 vscode怎么在终端运行程序 Apr 15, 2025 pm 06:42 PM

在 VS Code 中,可以通过以下步骤在终端运行程序:准备代码和打开集成终端确保代码目录与终端工作目录一致根据编程语言选择运行命令(如 Python 的 python your_file_name.py)检查是否成功运行并解决错误利用调试器提升调试效率

Python vs. JavaScript:学习曲线和易用性 Python vs. JavaScript:学习曲线和易用性 Apr 16, 2025 am 12:12 AM

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

See all articles