python3正则表达式的几个高级用法

本文详细介绍了Python3正则表达式的高级用法,包括贪婪与非贪婪匹配、自定义命名分组、数字分组、前置肯定与否定、后置肯定与否定分组,以及不捕获分组的使用。通过这些技巧,可以更高效地处理复杂文本数据,如网页抓取、配置文件解析等场景。

python3正则表达式的几个高级用法

一、 概述
本文举例说明python3正则表达式的一些高级级法,主要是各类分组,可应用于
1、复杂网页文件中的有用数据
例如,采用爬虫技术取得网页后,对网页内任何数据进行提取分析
2、 各类配置文件
可能是属性文件,读取属性文件中的键值对
可能是数据库各类查询的复杂匹配的参数解析,类似mybatis的动态sql语句解析,hibernate动态参数sql分析
二、 理解正则表达式的贪婪与非贪婪
1、 生活中的贪婪与非贪婪
例如公司员工餐厅发小西红柿,每人一次可以领取1—10个
如果有的人每次都领取10个,则这个人属于贪婪,就是在不犯错时,每次取最多
如果有的人每次都领取1个,则这个人属于不贪婪,就是在不犯错时,每次取最少
2、 正则表达式的贪婪与非贪婪定义
只有前面的字符串内容可多可少时,才存在贪婪与非贪婪
1) 贪婪语法
.*,取尽可能多的任意字符
\w+,取尽可能多的任意英文字母与数字一次以上
\d{2,5},尽可能取到2--5个数字字母
\s+,},尽可能取到任意多个空格一次以上
.?,任意字符取0次,或1次,尽可能取1次

2)  非贪婪语法
就是在贪婪定义后面加一个?
.*?,取尽可能少的任意字符,尽可能不取
\w+?,取尽可能少的任意英文字母与数字,尽可能只取1个
\d{2,5},尽可能少数字字母,尽可能只取2个
\s+,},尽可能取到最少空格,尽可能只取1个空格
.??,任意字符取0次,或1次,尽可能取0次

3)  贪婪与贪婪的最终匹配
无论贪婪,还是非贪婪,都要与后面内容继续匹配,才能最终确定本次匹配内容,有时给合后面匹配内容时,两都取值相同

3、 示例分析如下
python语法如下
import re
匹配到的结果列表=re.findall(r’正则字符串’,要匹配的字符串,re.I|re.S)
re.I,表示忽略大小写
re.S,表示忽略回行,所有字符包括回行字符

字符串贪婪正则非贪婪正则
www.baidu.com/num正则:
www\.baidu\.com\/.*
则能匹配到
www.baidu.com/num
有num
正则
www\.baidu\.com\/.*?
则能匹配到
www.baidu.com/
无num
www.baidu.com/num/456www\.baidu\.com\/.*\/\d+
则能匹配到
www.baidu.com/num/456
www\.baidu\.com\/.*?\/\d+
则能匹配到
www.baidu.com/num/456
此时与贪婪正则匹配相同
一段网页文本,希望能求出每个div的innerHTML
<div>….</div>
<div>….</div>
<div>….</div>
<div>….</div>
正则
<div>.*</div>
则不能匹配出每个<div>标签之间的文本innerText
正则
<div>.*?</div>
则能匹配出每个<div>标签之间的文本innerText

4、示例代码如下

import re
s1=re.findall(r'\D+\d+','abc123456') #结果为:['abc123456']
s2=re.findall(r'\D+\d+?','abc123456') #结果为:['abc1']
s2=re.findall(r'\D+\d*','abc123456') #结果为:['abc123456']
s2=re.findall(r'\D+\d*?','abc123456') #结果为:['abc']
s2=re.findall(r'\D+\d{2,4}','abc123456') #结果为:['abc1234']
s2=re.findall(r'\D+\d{2,4}?','abc123456',re.I) #结果为:['abc12']
s2=re.findall(r'\D+\d?','abc123456',re.I) #结果为:['abc1']
s2=re.findall(r'\D+\d??','abc123456',re.I) #结果为:['abc']

三、 正则表达式的自定义命名分组,(?P)
1、 语法说明
一个正则表达式可以有多个自定义名称的分组,可以能过分组名称提取到匹配的字符串
每一个分组定义是(?P<自定义分组名称>正则字符串)
例如
pattern=r’正则1(?P<组1>组1正则)正则2(?P<组2>组2正则)正则3(?P<组3>组3正则)’

2、 需求如下
这是一段java代码字符串,有下面几种分析需求
1) 需求1,求3个参数,,,,3组实现
a) 每个变量的数据类型
类型名称前后有数量不相同的空格
b) 每个变量名称
变量名称前有数量不相同的空格,后面有等号,等号前后有数量不相同的空格
c) 每个变量的值
值的前后有数量不相同的空格
变量最后一定有分号
2) 需求2,求2个参数, ,,2组实现
a) 每个变量名称
要清除变量前后空格
b) 每个变量的值
要清除值前后空格

3) 需求3,求1个参数,,1组实现
每个变量的值
要清除值前后空格

4) 需求4,求1个参数,,1组实现
每个变量名称
要清除变量名称前后空格

3、 示例代码

str='''
String s1="学习java";
String s2=  " ";
Float   价格=24000.89;
String desc =  "用于找工作技能提升。。。" ;
Integer num  =   12567   ;

'''

import re
#需求1,,分3组:<type>,<name>,<value>,求数据类型,变量名称,变量的值,下面3种求法,结果相同
s1=re.findall(r'(?=String|Float|Integer)(?P<type>\w+)\s+(?P<name>.*?)\s*?=\s*?(?P<value>.*?)\s*?;',str,re.I|re.S);              #结果是:[('String', 's1', '"学习java"'), ('String', 's2', '  " "'), ('Float', '价格', '24000.89'), ('String', 'desc', '  "用于找工作技能提升。。。"'), ('Integer', 'num', '   12567')]
s1=re.findall(r'(?P<type>String|Float|Integer\s+?\w+)\s+(?P<name>.*?)\s*?=\s*?(?P<value>["\d].*?)\s*?;',str,re.I|re.S);              #结果是:[('String', 's1', '"学习java"'), ('String', 's2', '  " "'), ('Float', '价格', '24000.89'), ('String', 'desc', '  "用于找工作技能提升。。。"'), ('Integer', 'num', '   12567')]
#优化上面,当变量前面有空格时,要清除["\d],表示双引号或数字开头,匹配结果自动加入到<value>组,正则语法为:不消耗前缀
s1=re.findall(r'(?=String|Float|Integer)(?P<type>\w+)\s+(?P<name>.*?)\s*?=\s*?(?=["\d])(?P<value>.*?)\s*?;',str,re.I|re.S);  #结果是:[('String', 's1', '"学习java"'), ('String', 's2', '" "'), ('Float', '价格', '24000.89'), ('String', 'desc', '"用于找工作技能提升。。。"'), ('Integer', 'num', '12567')]

#需求2,分2组:<name>,<value>,求变量名称,变量的值,
s1=re.findall(r'\s+?(?P<name>\S+?)\s*?=\s*?(?P<value>["\d].*?)\s*?;',str,re.I|re.S);     #结果是:[('s1', '"学习java"'), ('s2', '" "'), ('价格', '24000.89'), ('desc', '"用于找工作技能提升。。。"'), ('num', '12567')]

#需求3,分1组<value>,求每个变量的值,要清除首尾空格,给出2种求法
s1=re.findall(   r'=\s*?(?P<value>[\d"].*?)\s*?;',str,re.I|re.S);     #结果是:['"学习java"', '" "', '24000.89', '"用于找工作技能提升。。。"', '12567']
s1=re.findall(   r'=\s*?(?=[\d"])(?P<value>.*?)\s*?;',str,re.I|re.S); #结果是:['"学习java"', '" "', '24000.89', '"用于找工作技能提升。。。"', '12567']


#需求4,分1个<name>只取变量名称
s1=re.findall(r'.*?\s+(?P<name>\w+?)\s*?=.*?;',str,re.I|re.S); #结果是:['s1', 's2', '价格', 'desc', 'num']

四、 应用扩展
可以采用类似的方法,对任意复杂业务的sql语句进行配置分析,可能有任意多个字段条件操作,每个字段的值可能有或无,或在某一个范围,这样结合前台提交,后台用正则分组,可以提取任意复杂的sql条件查询,适用于hibernate的动态查询,及springjdbc自定义sql

1、 实现需求
当一个分组内容,重复出现2次或以上时,第2次起,可以引用前面定义的分组匹配,即
r’(P?pattern1)…(P?pattern2)…(P?pattern2)…(?P=name1)…(P=name2)…(?P=name3)’

即(?P=name1)重复匹配前面定义的(?Ppattern1),
(?P=name2)重复匹配前面定义的(?Ppattern2)

2、 示例如下


import re
#假设下面的每门课的学费,例如oracle:500元,java:1550元
str='''
  oracle:500,
  java:1550,
  bigdata:2000,
  php:500
  <oracle>500</oracle>
  <java>1550</java>
  <bigdata>2000</bigdata>
  <php>500</php>
  '''

#下面2行代码结果相同
s1=re.findall(r'oracle:(?P<name1>\d+),.*?java:(?P<name2>\d+),.*?bigdata:(?P<name3>\d+),.*?php:(?P<name4>\d+).*?<oracle>(?P=name1)</oracle>.*?<java>(?P=name2)</java>.*?<bigdata>(?P=name3)</bigdata>.*?<php>(?P=name4)</php>.*?',str,re.I|re.S)  #结果是:['500', '1800', '2000', '555']
s1=re.findall(r'oracle:(?P<name1>\d+),.*?java:(?P<name2>\d+),.*?bigdata:(?P<name3>\d+),.*?<oracle>(?P=name1)</oracle>.*?<java>(?P=name2)</java>.*?',str,re.I|re.S)  #结果是:['500', '1800', '2000', '555']

五、 数字分组,\number
1、 语法说明
每一段正则用一个加圆括起来时,便自动构成一个组,包括(?Ppattern)自定义命名组,也加入到分组序号中
如果后面有前面圆括中相同部分,则用数字序号表示匹配相同部分
r’(正则1)…(正则2)…(正则3) 。。。\1….\2….\3…’,
这里出现\1,表示匹配前面第1个圆括号正则内容,
这里出现\2,表示匹配前面第2个圆括号正则内容

2、 可以用数组分组取得自定义命名分组
例如用:\2 取得前面第2个圆括号(?Ppattern123)的内容
3、 示例如下


import re
#假设下面的每门课的学费,例如oracle:500元,java:1550元,bigdata:2000元,php:500元
str='''
  oracle:500,
  java:1550,
  bigdata:2000,
  php:500
  <oracle>500</oracle>
  <java>1550</java>
  <bigdata>2000</bigdata>
  <php>500</php>
  '''

#下面需求求所有每门课的学费,只求具体数字,体会(?P<name>)用法,下面2行代码结果相同
s1=re.findall(r'\D+:(?P<name>\d+),??',str,re.I|re.S)  #结果是:['500', '1550', '2000', '500']
s1=re.findall(r'(\w+):(?P<name1>\d+),.*?(\w+):(?P<name2>\d+),.*?(\w+):(?P<name3>\d+),.*?(\w+):(?P<name4>\d+).*?',str,re.I|re.S)  #结果是:[('oracle', '500', 'java', '1550', 'bigdata', '2000', 'php', '500')]

#下面需求,求出课程名称,及费用,4门课
s1=re.findall(r'.*?(\w+):(?P<name1>\d+),.*?(\w+):(?P<name2>\d+),.*?(\w+):(?P<name3>\d+),.*?(\w+):(?P<name4>\d+).*?',str,re.I|re.S)  #结果是:[('oracle', '500', 'java', '1550', 'bigdata', '2000', 'php', '500')]
#下面3行代码结果相同,括号的序号从1开始,(?P<name>...)也算一个括号
s1=re.findall(r'(\w+):(?P<name1>\d+),.*?(\w+):(?P<name2>\d+),.*?<\1>(?P=name1)</\1>.*?<\3>(?P=name2)</\3>.*?',str,re.I|re.S)  #结果是:[('oracle', '500', 'java', '1550')]
s1=re.findall(r'(\w+):(?P<name1>\d+),.*?(\w+):(?P<name2>\d+),.*?<\1>\2</\1>.*?<\3>(?P=name2)</\3>.*?',str,re.I|re.S)  #结果是:[('oracle', '500', 'java', '1550')]
s1=re.findall(r'(\w+):(?P<name1>\d+),.*?(\w+):(?P<name2>\d+),.*?<\1>\2</\1>.*?<\3>\4</\3>.*?',str,re.I|re.S)  #结果是:[('oracle', '500', 'java', '1550')]

#下面2行结果相同
s1=re.findall(r'.*?(\w+):(?P<name1>\d+),.*?(\w+):(?P<name2>\d+),.*?(\w+):(?P<name3>\d+),.*?(\w+):(?P<name4>\d+).*?<\1>\2</\1>.*?',str,re.I|re.S)  #结果是:[('oracle', '500', 'java', '1550', 'bigdata', '2000', 'php', '500')]
s1=re.findall(r'.*?(\w+):(?P<name1>\d+),.*?(\w+):(?P<name2>\d+),.*?(\w+):(?P<name3>\d+),.*?(\w+):(?P<name4>\d+).*?<\1>(?P=name1)</\1>.*?',str,re.I|re.S)  #结果是:[('oracle', '500', 'java', '1550', 'bigdata', '2000', 'php', '500')]
#下面2行结果相同
s1=re.findall(r'.*?(\w+):(?P<name1>\d+),.*?(\w+):(?P<name2>\d+),.*?(\w+):(?P<name3>\d+),.*?(\w+):(?P<name4>\d+).*?<\1>(?P=name1)</\1>.*?<\3>\4</\3>.*?',str,re.I|re.S)  #结果是:[('oracle', '500', 'java', '1550', 'bigdata', '2000', 'php', '500')]
s1=re.findall(r'.*?(\w+):(?P<name1>\d+),.*?(\w+):(?P<name2>\d+),.*?(\w+):(?P<name3>\d+),.*?(\w+):(?P<name4>\d+).*?<\1>(?P=name1)</\1>.*?<\3>(?P=name2)</\3>.*?',str,re.I|re.S)  #结果是:[('oracle', '500', 'java', '1550', 'bigdata', '2000', 'php', '500')]
#下面2行结果相同
s1=re.findall(r'.*?(\w+):(?P<name1>\d+),.*?(\w+):(?P<name2>\d+),.*?(\w+):(?P<name3>\d+),.*?(\w+):(?P<name4>\d+).*?<\1>(?P=name1)</\1>.*?<\3>(?P=name2)</\3>.*?<\5>\6</\5>.*?',str,re.I|re.S)  #结果是:[('oracle', '500', 'java', '1550', 'bigdata', '2000', 'php', '500')]
s1=re.findall(r'.*?(\w+):(?P<name1>\d+),.*?(\w+):(?P<name2>\d+),.*?(\w+):(?P<name3>\d+),.*?(\w+):(?P<name4>\d+).*?<\1>(?P=name1)</\1>.*?<\3>(?P=name2)</\3>.*?<\5>(?P=name3)</\5>.*?',str,re.I|re.S)  #结果是:[('oracle', '500', 'java', '1550', 'bigdata', '2000', 'php', '500')]

#下面2行结果相同
s1=re.findall(r'.*?(\w+):(?P<name1>\d+),.*?(\w+):(?P<name2>\d+),.*?(\w+):(?P<name3>\d+),.*?(\w+):(?P<name4>\d+).*?<\1>(?P=name1)</\1>.*?<\3>(?P=name2)</\3>.*?<\5>\6</\5>.*?<\7>\8</\77>.*?',str,re.I|re.S)  #结果是:[('oracle', '500', 'java', '1550', 'bigdata', '2000', 'php', '500')]
s1=re.findall(r'.*?(\w+):(?P<name1>\d+),.*?(\w+):(?P<name2>\d+),.*?(\w+):(?P<name3>\d+),.*?(\w+):(?P<name4>\d+).*?<\1>(?P=name1)</\1>.*?<\3>(?P=name2)</\3>.*?<\5>\6</\5>.*?<\7>(?P=name4)</\7>.*?',str,re.I|re.S)  #结果是:[('oracle', '500', 'java', '1550', 'bigdata', '2000', 'php', '500')]

s1=re.findall(r'(\D+):(?P<name1>\d+),.*?(\D+):(?P<name2>\d+),.*?(\D+):(?P<name3>\d+),.*?(\D+):(?P<name4>\d+),.*?<\1>(?P=name1)<\1>.*?',str,re.I|re.S)  #结果是:['500', '1800', '2000', '555']

#下面
s1=re.findall(r'oracle:(?P<name1>\d+),.*?java:(?P<name2>\d+),.*?bigdata:(?P<name3>\d+),.*?php:(?P<name4>\d+).*?<oracle>(?P=name1)</oracle>.*?<java>(?P=name2)</java>.*?<bigdata>(?P=name3)</bigdata>.*?<php>(?P=name4)</php>.*?',str,re.I|re.S)  #结果是:['500', '1800', '2000', '555']
s1=re.findall(r'oracle:(?P<name1>\d+),.*?java:(?P<name2>\d+),.*?bigdata:(?P<name3>\d+),.*?<oracle>(?P=name1)</oracle>.*?<java>(?P=name2)</java>.*?',str,re.I|re.S)  #结果是:['500', '1800', '2000', '555']

六、 前置肯定分组,(?=pattern)
1、 实现需求
表示以。。。开头,不消耗匹配内容,而是加入后面正则表达式中,所以也称为前置不消耗分组
r’…(?=pattern1)(?Ppattern123)…’等效于
r’… (?Ppattern1pattern123)…’

2、 示例如下


#前置肯定(?=pattern)
import re

#查询url是否以http://www.开头
s1=re.findall(r'(?=http:\/\/www\.)(?P<name>.*)','http://www.baidu.com') #结果是:['http://www.baidu.com']
s1=re.findall(r'(?=http:\/\/www\.)(?P<name>.*)','https://www.baidu.com') #结果是:[]


七、 前置否定分组,(?!pattern)
1、 实现需求
表示不包含。。。开头的其余部分,
r’…(!pattern1)(?Ppattern123)…’等效于
r’… (?P!pattern1pattern123)…’,pattern1的内容只是一个最小正则内容

2、 示例如下


#前置否定(?!pattern)
import re

#查询url不包含http://开头以外的其余部分
s1=re.findall(r'(?!http:\/\/)(?P<name>www.*)','http://www.baidu.com') #结果是:['www.baidu.com']

#查询所有非数字部分,即前面不包含数字,后面是字母
s1=re.findall(r'(?!\d+)(?P<name>\D+)','123java456oracle367bigdata478') #结果是:['java', 'oracle', 'bigdata']


八、 后置肯定分组,(?<=pattern)
1、 实现需求
表示包含以。。。结尾的所有部分,不消耗匹配内容,而是加入前面分组中
r’… (?Ppattern123)(?<=pattern1)…’等效于
r’… (?Ppattern123pattern1)…’

2、 示例如下


#后置肯定(?<=pattern)
#下面匹配前面是数字一组,后面包含数字结尾的所有分组
import re
 s=re.findall(r'(?P<name>\d+)(?<=\d)','987java678abc891abe2345stu2454dy')#结果是:['987', '678', '891', '2345', '2454']
#下面匹配前面是字母一组,后面包含字母的所有分组
 s=re.findall(r'(?P<name>\D+)(?<=\D)','java678abc891abe2345stu2454dy')#结果是:['java', 'abc', 'abe', 'stu', 'dy']

九、 后置否定分组,(?


#后置否定(?<=pattern)
#下面匹配前面是数字一组,后面不包含字母的所有分组
 s=re.findall(r'(?P<name>\d+)(?<!\D)','987java678abc891abe2345stu2454dy')#结果是:['987', '678', '891', '2345', '2454']
#下面匹配前面是字母一组,后面不包含数字的所有分组
 s=re.findall(r'(?P<name>\D+)(?<!\d)','java678abc891abe2345stu2454dy')#结果是:['java', 'abc', 'abe', 'stu', 'dy']

十、 消耗—不捕获-不参与分组的圆括号,(?:pattern)
1、 实现需求
参与匹配,不捕获,即不返回结果,不将匹配结果送给后面
类比前置肯定匹配(?=pattern)也不捕获结果,但将匹配结果送给后面分组
2、 示例如下



  str='''
        s=http://www-1.baidu.com
        s=https://www-2.baidu.com
        s=ftp://www-3.baidu.com
  '''
  #请注意,下面的str后面,没有re.S,否则操作有错,这里只对每一行进行正则匹配捕获
  s1=re.findall(r'(?:http|https|ftp):\/\/(?P<name>.*)',str)
  #结果是:['www-1.baidu.com', 'www-2.baidu.com', 'www-3.baidu.com']
  s1=re.findall(r'(?:http|https|ftp)(?P<name>:\/\/.*)',str)
  #结果是:['://www-1.baidu.com', '://www-2.baidu.com', '://www-3.baidu.com']

  s1=re.findall(r'(http|https|ftp):\/\/(?P<name>.*)',str)
  #结果是:[('http', 'www-1.baidu.com'), ('https', 'www-2.baidu.com'), ('ftp', 'www-3.baidu.com')]

  s1=re.findall(r'(?:https:)(?P<name>.*)',str,re.I)
  #结果是:['//www-2.baidu.com']

十一、 前置—后置位置颠倒及对比(?:pattern)
1、 实现需求
r‘…(?<=pattern1)mypattern(?=pattern2) …’
将后置放在前面,将前置放在后面,结果是
(?<=pattern1)后置参与匹配、不捕获、消耗
(?=pattern2)前置参与匹置、不捕获、消耗
2、 语法结果理解
1) 将后置放在前面时
因为他只参与后置前一个正则表达式的匹配、捕获、消耗,所以不参与
2) 将前置放在后面时
因为前置只参与他后面的一个前置,对后面的内容捕获,所以本段内容匹配、消耗、不捕获
3) mypattern有无分组,即圆括号,结果是一样的
4) 实际测试时,如果mypattern有圆括号,则此时的前置颠到效果与加入(?:pattern)一样
3、 示例如下


#前置肯定与后置肯定颠倒颠颠位置后,则匹配、不捕获、消耗
import re
str = r'<div class="test1"><h1><span>学习大数据bigData</span></h1></div>'
s1 = re.findall(r"(?<=<h1>).+?(?=</h1>)",str)
#前置与后置颠倒时,则只匹配、不捕获,可以理解为后置己经参与前面一个正则的捕获了,而前置放在后面,则对前面来说,不捕获结果
#结果是:['<span>学习大数据bigData</span>']

s1 = re.findall(r"(?:<h1>).+?(?=</h1>)",str)
#结果是:['<h1><span>学习大数据bigData</span>'],说明(?:pattern)不参与分组,但后面无分组时,则参与消耗
s1 = re.findall(r"(?:<h1>)(?P<id123>.+?)(?=</h1>)",str)
#结果是:['<span>学习大数据bigData</span>'],说明(?:pattern)不参与分组,但后面有分组时,则不参与消耗
s1 = re.findall(r"(?:<h1>)(?P<id123>.+?)(?:</h1>)",str)
#结果是:['<span>学习大数据bigData</span>'],说明(?:pattern)不参与分组,前后有分组时,则不参与消耗


s1 = re.findall(r"(?=<h1>).+?(?=</h1>)",str)
#结果是:['<h1><span>学习大数据bigData</span>'],前置发挥正常作用,前置放在后面时,匹配,不对前面消耗

s1 = re.findall(r"(?:<h1>).+?(?=</h1>)",str)
#结果是:['<h1><span>学习大数据bigData</span>'],说明(?:pattern)对后面无分组时,参与捕获、消耗

s1 = re.findall(r"(?:<h1>)(.+?)(?=</h1>)",str)
#结果是:['<span>学习大数据bigData</span>'],说明(?:pattern)对后面有分组时,消耗、但不参与捕获

created by 刘明
这里写图片描述

内容概要:本文系统研究了基于豪猪优化算法(CPO)的多无人机协同集群在三维空间中的避障路径规划问题,聚焦于实现以最低成本为目标的航迹优化,综合考虑路径长度、飞行高度、威胁规避及转弯角度等多个关键因素。通过构建精细化的三维环境模型与多无人机协同机制,采用Matlab平台实现CPO算法的仿真与验证,充分展示了该算法在复杂动态障碍环境下的高效搜索能力与全局优化性能。研究不仅涵盖了路径规划的数学建模与目标函数设计,还深入探讨了算法的收敛特性与鲁棒性,为智能群体系统在实际场景中的应用提供了理论依据与技术支撑。; 适合人群:具备一定编程基础和优化算法背景,从事无人机系统控制、智能路径规划、群体协同、人工智能与自动化等相关领域的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①应用于多无人机协同执行侦察、灾害监测、应急救援、区域巡检等复杂任务中的自主路径规划;②为智能优化算法在三维动态环境下的路径决策问题提供可复现的技术范例;③支持研究人员对CPO算法与其他主流群智能算法(如PSO、GWO、WOA等)进行性能对比与改进研究,推动路径规划技术的发展。; 阅读建议:建议结合提供的Matlab代码进行实践操作,重点理解目标函数的多维度建模方式与CPO算法的迭代优化流程,可通过调整环境参数与约束条件进行仿真实验,对比不同算法在相同场景下的路径质量与收敛速度,从而深入掌握其优势与适用边界。
内容概要:本文围绕电动汽车参与电力系统运行备用的能力评估展开深入研究,利用Matlab代码实现对电动汽车集群提供运行备用服务的建模与仿真分析。研究重点在于量化电动汽车作为分布式灵活资源参与电网辅助服务的潜力,通过构建精细化的数学模型,分析其可调功率容量、响应速度、时空分布特性及聚合能力,并采用多面体聚合、内近似模型与闵可夫斯基和等先进方法精确刻画其可调度能力边界。研究进一步结合大规模电动汽车接入场景,探讨其在多时间尺度调度框架下参与调峰、调频等辅助服务的优化策略,评估其对提升高比例可再生能源电网灵活性与稳定性的贡献,最终通过仿真验证所提模型与方法的有效性与实用性。; 适合人群:具备电力系统分析、智能电网、新能源汽车或优化调度等相关专业背景,熟悉Matlab/Simulink仿真工具,从事科研、工程应用的高校研究生、科研人员及电力行业工程师。; 使用场景及目标:①精确评估大规模电动汽车集群在不同约束条件下可提供的运行备用容量;②研究电动汽车在日前、日内及实时调度中的动态响应能力与优化调度策略;③为高渗透率新能源电力系统提供基于移动储能的灵活性资源解决方案,支撑电网安全经济运行。; 阅读建议:建议结合Matlab代码与技术文档同步学习,重点关注多面体聚合建模、能力边界计算及优化调度算法的设计与实现,可进一步拓展至V2G(车辆到电网)、需求响应等互动场景进行二次开发与应用验证。
打开链接下载源码: https://pan.quark.cn/s/a4b39357ea24 OpenCV(开源计算机视觉库)中的DNN(Deep Neural Network)模块是一种功能强大的工具,其目的是用于深度学习模型的操作。该模块使得开发人员能够在OpenCV环境中直接运用已经训练好的深度学习网络,以执行图像识别、目标检测、图像分割等多种功能。DNN模块能够兼容多种深度学习框架的模型,包括TensorFlow、Caffe、ONNX等。 一、DNN模块概述 OpenCV的DNN模块是为了简化深度学习模型的集成过程而专门设计的,它允许开发人员加载预先训练好的神经网络模型,并在图像数据上执行前向传播操作。借助这个模块,用户可以选用GPU或者CPU来提升计算效率,从而构建出高效的应用程序。 二、目标检测案例 在OpenCV的DNN模块中,目标检测是一个常见的应用情形。例如,可以选用SSD(Single Shot Multibox Detector)、YOLO(You Only Look Once)或者 Faster R-CNN 等模型进行实时的目标检测。这些模型能够识别并定位图像中的多个对象,并返回每个对象的类别和边界框坐标。 三、模型转换:PB到PBTXT 在OpenCV中运用TensorFlow模型时,通常需要处理的是`.pb`格式的模型文件,这是TensorFlow的二进制模型文件格式。然而,为了能够读取模型的结构信息,我们需要`.pbtxt`格式的文本文件。转换过程涉及解析`.pb`文件并将其结构信息导出为`.pbtxt`格式,这样做可以让人清晰地了解网络层和参数的配置。在OpenCV中,可以使用`tf.train.write_graph()`函数将.pb...
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值