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/456www\.baidu\.com\/.*?\/\d+则能匹配到www.baidu.com/num/456此时与贪婪正则匹配相同

一段网页文本,希望能求出每个div的innerHTML

….
….
….
….

正则

.*

则不能匹配出每个

标签之间的文本innerText正则

.*?

则能匹配出每个

标签之间的文本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组:,,,求数据类型,变量名称,变量的值,下面3种求法,结果相同

s1=re.findall(r'(?=String|Float|Integer)(?P\w+)\s+(?P.*?)\s*?=\s*?(?P.*?)\s*?;',str,re.I|re.S); #结果是:[('String', 's1', '"学习java"'), ('String', 's2', ' " "'), ('Float', '价格', '24000.89'), ('String', 'desc', ' "用于找工作技能提升。。。"'), ('Integer', 'num', ' 12567')]

s1=re.findall(r'(?PString|Float|Integer\s+?\w+)\s+(?P.*?)\s*?=\s*?(?P["\d].*?)\s*?;',str,re.I|re.S); #结果是:[('String', 's1', '"学习java"'), ('String', 's2', ' " "'), ('Float', '价格', '24000.89'), ('String', 'desc', ' "用于找工作技能提升。。。"'), ('Integer', 'num', ' 12567')]

#优化上面,当变量前面有空格时,要清除["\d],表示双引号或数字开头,匹配结果自动加入到组,正则语法为:不消耗前缀

s1=re.findall(r'(?=String|Float|Integer)(?P\w+)\s+(?P.*?)\s*?=\s*?(?=["\d])(?P.*?)\s*?;',str,re.I|re.S); #结果是:[('String', 's1', '"学习java"'), ('String', 's2', '" "'), ('Float', '价格', '24000.89'), ('String', 'desc', '"用于找工作技能提升。。。"'), ('Integer', 'num', '12567')]

#需求2,分2组:,,求变量名称,变量的值,

s1=re.findall(r'\s+?(?P\S+?)\s*?=\s*?(?P["\d].*?)\s*?;',str,re.I|re.S); #结果是:[('s1', '"学习java"'), ('s2', '" "'), ('价格', '24000.89'), ('desc', '"用于找工作技能提升。。。"'), ('num', '12567')]

#需求3,分1组,求每个变量的值,要清除首尾空格,给出2种求法

s1=re.findall( r'=\s*?(?P[\d"].*?)\s*?;',str,re.I|re.S); #结果是:['"学习java"', '" "', '24000.89', '"用于找工作技能提升。。。"', '12567']

s1=re.findall( r'=\s*?(?=[\d"])(?P.*?)\s*?;',str,re.I|re.S); #结果是:['"学习java"', '" "', '24000.89', '"用于找工作技能提升。。。"', '12567']

#需求4,分1个只取变量名称

s1=re.findall(r'.*?\s+(?P\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

500

1550

2000

500

'''

#下面2行代码结果相同

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

s1=re.findall(r'oracle:(?P\d+),.*?java:(?P\d+),.*?bigdata:(?P\d+),.*?(?P=name1).*?(?P=name2).*?',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

500

1550

2000

500

'''

#下面需求求所有每门课的学费,只求具体数字,体会(?P)用法,下面2行代码结果相同

s1=re.findall(r'\D+:(?P\d+),??',str,re.I|re.S) #结果是:['500', '1550', '2000', '500']

s1=re.findall(r'(\w+):(?P\d+),.*?(\w+):(?P\d+),.*?(\w+):(?P\d+),.*?(\w+):(?P\d+).*?',str,re.I|re.S) #结果是:[('oracle', '500', 'java', '1550', 'bigdata', '2000', 'php', '500')]

#下面需求,求出课程名称,及费用,4门课

s1=re.findall(r'.*?(\w+):(?P\d+),.*?(\w+):(?P\d+),.*?(\w+):(?P\d+),.*?(\w+):(?P\d+).*?',str,re.I|re.S) #结果是:[('oracle', '500', 'java', '1550', 'bigdata', '2000', 'php', '500')]

#下面3行代码结果相同,括号的序号从1开始,(?P...)也算一个括号

s1=re.findall(r'(\w+):(?P\d+),.*?(\w+):(?P\d+),.*?<\1>(?P=name1)\1>.*?<\3>(?P=name2)\3>.*?',str,re.I|re.S) #结果是:[('oracle', '500', 'java', '1550')]

s1=re.findall(r'(\w+):(?P\d+),.*?(\w+):(?P\d+),.*?<\1>\2\1>.*?<\3>(?P=name2)\3>.*?',str,re.I|re.S) #结果是:[('oracle', '500', 'java', '1550')]

s1=re.findall(r'(\w+):(?P\d+),.*?(\w+):(?P\d+),.*?<\1>\2\1>.*?<\3>\4\3>.*?',str,re.I|re.S) #结果是:[('oracle', '500', 'java', '1550')]

#下面2行结果相同

s1=re.findall(r'.*?(\w+):(?P\d+),.*?(\w+):(?P\d+),.*?(\w+):(?P\d+),.*?(\w+):(?P\d+).*?<\1>\2\1>.*?',str,re.I|re.S) #结果是:[('oracle', '500', 'java', '1550', 'bigdata', '2000', 'php', '500')]

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

#下面

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

s1=re.findall(r'oracle:(?P\d+),.*?java:(?P\d+),.*?bigdata:(?P\d+),.*?(?P=name1).*?(?P=name2).*?',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.*)','http://www.baidu.com') #结果是:['http://www.baidu.com']

s1=re.findall(r'(?=http:\/\/www\.)(?P.*)','https://www.baidu.com') #结果是:[]

七、 前置否定分组,(?!pattern)

1、 实现需求

表示不包含。。。开头的其余部分,

r’…(!pattern1)(?Ppattern123)…’等效于

r’… (?P!pattern1pattern123)…’,pattern1的内容只是一个最小正则内容

2、 示例如下#前置否定(?!pattern)

import re

#查询url不包含http://开头以外的其余部分

s1=re.findall(r'(?!http:\/\/)(?Pwww.*)','http://www.baidu.com') #结果是:['www.baidu.com']

#查询所有非数字部分,即前面不包含数字,后面是字母

s1=re.findall(r'(?!\d+)(?P\D+)','123java456oracle367bigdata478') #结果是:['java', 'oracle', 'bigdata']

八、 后置肯定分组,(?<=pattern)

1、 实现需求

表示包含以。。。结尾的所有部分,不消耗匹配内容,而是加入前面分组中

r’… (?Ppattern123)(?<=pattern1)…’等效于

r’… (?Ppattern123pattern1)…’

2、 示例如下#后置肯定(?<=pattern)

#下面匹配前面是数字一组,后面包含数字结尾的所有分组

import re

s=re.findall(r'(?P\d+)(?<=\d)','987java678abc891abe2345stu2454dy')#结果是:['987', '678', '891', '2345', '2454']

#下面匹配前面是字母一组,后面包含字母的所有分组

s=re.findall(r'(?P\D+)(?<=\D)','java678abc891abe2345stu2454dy')#结果是:['java', 'abc', 'abe', 'stu', 'dy']

九、 后置否定分组,(?#后置否定(?<=pattern)

#下面匹配前面是数字一组,后面不包含字母的所有分组

s=re.findall(r'(?P\d+)(?

#下面匹配前面是字母一组,后面不包含数字的所有分组

s=re.findall(r'(?P\D+)(?

十、 消耗—不捕获-不参与分组的圆括号,(?: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.*)',str)

#结果是:['www-1.baidu.com', 'www-2.baidu.com', 'www-3.baidu.com']

s1=re.findall(r'(?:http|https|ftp)(?P:\/\/.*)',str)

#结果是:['://www-1.baidu.com', '://www-2.baidu.com', '://www-3.baidu.com']

s1=re.findall(r'(http|https|ftp):\/\/(?P.*)',str)

#结果是:[('http', 'www-1.baidu.com'), ('https', 'www-2.baidu.com'), ('ftp', 'www-3.baidu.com')]

s1=re.findall(r'(?:https:)(?P.*)',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'

学习大数据bigData

'

s1 = re.findall(r"(?<=

).+?(?=

)",str)

#前置与后置颠倒时,则只匹配、不捕获,可以理解为后置己经参与前面一个正则的捕获了,而前置放在后面,则对前面来说,不捕获结果

#结果是:['学习大数据bigData']

s1 = re.findall(r"(?:

).+?(?=

)",str)

#结果是:['

学习大数据bigData'],说明(?:pattern)不参与分组,但后面无分组时,则参与消耗

s1 = re.findall(r"(?:

)(?P.+?)(?=

)",str)

#结果是:['学习大数据bigData'],说明(?:pattern)不参与分组,但后面有分组时,则不参与消耗

s1 = re.findall(r"(?:

)(?P.+?)(?:

)",str)

#结果是:['学习大数据bigData'],说明(?:pattern)不参与分组,前后有分组时,则不参与消耗

s1 = re.findall(r"(?=

).+?(?=

)",str)

#结果是:['

学习大数据bigData'],前置发挥正常作用,前置放在后面时,匹配,不对前面消耗

s1 = re.findall(r"(?:

).+?(?=

)",str)

#结果是:['

学习大数据bigData'],说明(?:pattern)对后面无分组时,参与捕获、消耗

s1 = re.findall(r"(?:

)(.+?)(?=

)",str)

#结果是:['学习大数据bigData'],说明(?:pattern)对后面有分组时,消耗、但不参与捕获

created by 刘明

python3.7正则表达式语法_python3正则表达式的几个高级用法相关推荐

  1. python正则表达式语法-python正则表达式语法大全讲解教程实例一

    东尧爱分享 这是东尧每天一篇文章的第32天 东尧写文章的目标:分享东尧的经验和思考,帮你获取物质和精神两方面幸福. 在python爬虫中,我们经常会需要进行字符串的匹配,而正则表达式是一种用来匹配字符 ...

  2. java 正则表达式语法_Java 正则表达式基础语法

    基础符号 首尾匹配^:匹配输入字符串开始的位置 $:匹配输入字符串结尾的位置 例:"^hello$"含义为该字符串开头必须为h,结尾必须为oprivate static void ...

  3. php的qq邮箱正则表达式语法_正则表达式综合应用:qq邮箱提取

    这里应用到的有正则表达式.qq号的正则表达式的"[1-9][0-9]{4,10}".用户界面用到了tkinter,不难理解. 其基本思路是: 1.用户界面启动,显示要处理的信息. ...

  4. html js正则表达式语法,js正则表达式 非中文_js正则表达式匹配中文_js正则表达式语法...

    腾讯云活动聚集了最新的降价打折.特惠折扣等资料,你在这里可以寻找云服务器.域名..小流程等等多种不同产品的促销活动,还有这些品牌的免费试用哦. 因为对js中的正则不太了解,可以参考一下js 中正则表达 ...

  5. javascript正则表达式(语法以及正则表达式修饰符)

    正则表达式(英语:Regular Expression,在代码中常简写为regex.regexp或RE)使用单个字符串来描述.匹配一系列符合某个句法规则的字符串搜索模式. 搜索模式可用于文本搜索和文本 ...

  6. java 正则表达式 demo_JAVA正则表达式语法

    JAVA正则表达式语法(转) 正则表达式语法 正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符").模式描述在搜索文本时要匹配的一个或 ...

  7. 相当全的JS及.NET正则表达式语法

    正则表达式语法 一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式.该模式描 述在查找文字主体时待匹配的一个或多个字符串.正则表达式作为一个模板,将某个字符模 ...

  8. vbs字符串正则_VBS正则表达式语法

    正则表达式语法 一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式.该模式描述在查找文字主体时待匹配的一个或多个字符串.正则表达式作为一个模板,将某个字符模式 ...

  9. .net core 正则表达式 获取 等号后面的值_Python3 正则表达式

    Python人工智能 - python 人工智能-神经网络 - 创客学院直播室​www.makeru.com.cnPython AI开发实战营 - Day2:Python世界中的封装与异常 - 创客学 ...

最新文章

  1. HEVC/H.265 的未来必须是使用并行处理(OpenCL?) OpenCV和OpenCL区别
  2. django分页模块
  3. 如何彻底删除SVN中的文件和文件夹(附恢复方法)
  4. python 怎么取对数_概率矩阵分解(PMF)及MovieLens上的Python代码
  5. UnitTest in .NET 系列文章目录
  6. 为什么ctrl+shift+方向键不管用了_键盘侠丨Shift键的快捷运用
  7. iOS 控件宽高字体大小适配方法
  8. 下一步linux命令bzip,linux命令bzip2
  9. ipv4 pxe 联想start_start pxe over ipv4 和start pxe over ipv6 开机出现问题
  10. 资源:在10天内建立区块链知识框架
  11. 表格识别-pytorch
  12. 传统和互联网门禁系统的创新应用和价值探讨
  13. 设置了position: fixed; 并且能够左右滚动 #html #Css
  14. 高通发布了全球最领先的5G基带芯片,不过华为将很快反超
  15. Unity3D 中 Generic 动画导入设置和 Root Motion 之间的关系
  16. JDK自带的Timer定时器实现每天24点修改数据
  17. vlookup反向查询_VLOOKUP的反向查找功能
  18. 你的苹果Mac键盘锁住了要怎么办呢
  19. C300--HGU ONU 配置思路指导_方式1
  20. 关于spotlight for Windows和spotlight for oracle的使用

热门文章

  1. 设计新Xlator扩展GlusterFS[转]
  2. 【转】最小编辑距离 算法原理
  3. CodeBlocks 更改 gui 程序为 命令行
  4. 国际域名也将列入监管范畴(本文转载自【易名中国】)
  5. 解决2003不支持FLV的方法
  6. (转载)关于IAP与APP互相跳转的实现
  7. Hyperledger Fabric 智能合约实战 (7) windows安装fabric
  8. C++ Primer 5th笔记(chap 12 动态内存)allocator类
  9. 字符串函数实现(strlen,strcpy,strcmp,strcat,strrev)
  10. 【python】数据结构与算法—双端队列(一)