Python-正则表达式详解-快速掌握正则表达式核心函数

news2024/9/20 1:06:34

正则表达式为为高级的文本模式匹配、抽取或文本形式的搜索和替换功能提供了基础。本文主要介绍python正则表达式的一些基础功能,掌握它也可以使得在python编程中处理字符串游刃有余。


1.简介

正则表达式是一些由字符和特殊符号组成的字符串,匹配一系列有相似特征的字符串。Python 通过标准库中的 re 模块来支持正则表达式。

2.特殊符号和字符

表示法

描述

示例

实例解释

literal

匹配文本字符串的字面值

this

匹配this

re1|re2

匹配正则表达式re1 或者 re2

foo|bar

foo或者bar

.

匹配任何字符(除了\n 之外)(一个.一个字符)

b.b

bsb,b1b...

^

匹配字符串起始部分

^Dear

匹配所有Dear开头的字符

$

匹配字符串终止部分

txt$

匹配以txt结尾的字符串

*

匹配0 次或者多次前面出现的正则表达式

5*

0个或多个5

+

匹配1 次或者多次前面出现的正则表达式

5+

1个或多个5

?

匹配0 次或者 1 次前面出现的正则表达式

5?

0个或1个5

{N}

匹配N 次前面出现的正则表达式(精准)

X{3}

3个X

{N,}

匹配N 次前面出现的正则表达式

X{3}

3个及以上X

{M,N}

匹配M~N 次前面出现的正则表达式

X{2,5}

2到5个X

[…]

匹配来自字符集的任意单一字符

[aeiou]

a,e,i,o,u的任一个

[..x−y..]

匹配x~y 范围中的任意单一字符

[2-5], [D-F]

2,3,4,5任一个,D,E,F任一个

[^…]

不匹配此字符集中出现的任何一个字符,包括某一范围的字符

[^aeiou],[^0-9]

不匹配a,e,i,o,u任何一个字母,不匹配任一个数字

表一常见正则表达式符号

表示法

描述

示例

实例解释

\d

匹配任何十进制数字,与[0-9]一致

\d{11}

表示11位数字

\D

非数字字符,与\d 相反

\D{5}

5个非数字字符

\w

匹配任何字母数字字符,与[A-Za-z0-9_]相同

\w+

数字和字符构成的字符串均可匹配到

\W

匹配非数字字母

\s,\n, \t, \r, \v, \f, 等

匹配任何空格字符,匹配一个换行符,匹配一个制表符,匹配回车,匹配垂直制表符,匹配换页符

\S

匹配非空白符号

\b

匹配任何单词边界

er\b

可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'

\B

匹配非单词边界(要包含)

er\B

能匹配"verb" 中的 'er',但不能匹配 "never" 中的 'er'

\A

匹配整个字符串的开始,不支持多行模式

\Aabc

整个字符串abc开头匹配不上xyz\nabc

\Z(大写)

匹配字符串的结束,如果是存在换行,只匹配到换行前的结束字符串。

def\Z

整个字符串匹配以def结尾。匹配不上def\nxyz

\z(小写)

匹配字符串结束

xyz\Z

整个字符串匹配以xyz结尾。可以匹配def\nxyz

\G

匹配最后匹配完成的位置

表二常见正则表达式特殊字符

表示法

描述

示例

实例解释

(?#…)

表示注释,所有内容都被忽略

(?=…)

前向肯定断言

1、表达式一(?<=子组表达式)表达式二

2、表达式一可选,对前向肯定断言没有影响。首先匹配后面的表达式二捕获内容二,然后用子组表达式从开始位置匹配内容二(相当于子组表达式前面固定添加^),如果匹配成功,则断言成功,否则断言失败。断言成功整条表达式返回成功。断言失败整条表达式返回失败。

3、避免没有表达式二

1、re.search(r'(?=abc)abc',"fishc@abcch")

2、re.search(r'@(?=abc)abcch',"fishc@abcch")

3、re.search(r'(?=abc)@abc',"fishc@abcch")

4、re.search(r'fishc@abc(?=abc)ch',"fishc@abcch")

5、re.search(r'(?=.abc)@abc',"fishc@abcch")

6、re.search(r'fishc@(?=abc)',"fishc@abcch")

7、re.search(r'fish(?=abc)',"fishc@abcch")

8、re.search(r'(?=abc)',"fishc@abcch")

1、span=(6, 9), match='abc'

2、span=(5, 11), match='@abcch'

3、None

4、None

5、span=(5, 9), match='@abc'

6、span=(0, 6), match='fishc@'

7、None

8、span=(6, 6), match=''

(?!…)

前向否定断言

1、表达式一(?<=子组表达式)表达式二

2、表达式一可选,对前向否定断言没有影响。首先匹配后面的表达式二捕获内容二,然后用子组表达式从开始位置匹配内容二(相当于子组表达式前面固定添加^),如果匹配成功,则断言失败,否则断言成功。断言成功整条表达式返回成功。断言失败整条表达式返回失败。

3、避免没有表达式二

1、re.search(r'(?!abc)@abc',"fishc@abcch")

2、re.search(r'fishc@abc(?=abc)ch',"fishc@abcch")

3、re.search(r'(?!abc)abc',"fishc@abcch")

4、re.search(r'@(?!abc)abcch',"fishc@abcch")

5、re.search(r'fishc@(?!abc)',"fishc@abcch")

6、re.match(r'fishc@(?!abc)',"fishc@abcch")

7、re.search(r'(?!abc)',"fishc@abcch")

1、span=(5, 9), match='@abc'

2、span=(0, 11), match='fishc@abcch'

3、None

4、None

5、None

6、None

7、span=(0, 0), match=''

(?<=…)

后向肯定断言

1、表达式一(?<=子组表达式)表达式二

2、首先匹配表达式一捕获内容一,然后用子组表达式从结束位置匹配内容一(相当于子组表达式后面固定添加$),如果匹配成功,则断言成功,否则断言失败。断言成功如果有表达式二则执行表达式二,如果没有整条表达式返回成功。如果断言失败,则整条表达式返回失败。

3、避免没有表达式一

1、re.search(r'fishc@abc(?<=abc)',"fishc@abcch")

2、re.search(r'fishc@abcch(?<=abc)',"fishc@abcch"

3、re.search(r'fishc@(?<=abc)abc',"fishc@abcch")

4、re.search(r'fishc@abc(?<=abc)ch',"fishc@abcch"

5、re.search(r'(?<=abc)abc',"fishc@abcch")

6、re.search(r'(?<=abc)ch',"fishc@abcch")

7、re.search(r'(?<=abc)',"fishc@abcch")

1、span=(0, 9), match='fishc@abc'

2、None

3、None

4、span=(0, 11), match='fishc@abcch'

5、None

6、span=(9, 11), match='ch'

7、span=(9, 9), match=''

(?<!…)

后向否定断言

1、表达式一(?<=子组表达式)表达式二

2、首先匹配表达式一捕获内容一,然后用子组表达式从结束位置匹配内容一(相当于子组表达式后面固定添加$),如果匹配成功,则断言失败,否则断言成功。断言成功如果有表达式二则执行表达式二,如果没有整条表达式返回成功。如果断言失败,则整条表达式返回失败。

3、避免没有表达式一

1、re.search(r'fishc@abcch(?<!abc)',"fishc@abcch")

2、re.search(r'fishc@(?<!abc)abc',"fishc@abcch")

3、re.search(r'fishc@abc(?<!abc)',"fishc@abcch")

4、re.search(r'fishc@abc(?<!abc)ch',"fishc@abcch")

5、re.search(r'(?<!abc)abcch',"fishc@abcch")

6、re.search(r'(?<!abc)shc',"fishc@aabcch")

7、re.search(r'(?<!abc)',"fishc@abcch")

1、span=(0, 11), match='fishc@abcch'

2、span=(0, 9), match='fishc@abc'

3、None

4、None

5、span=(6, 11), match='abcch'

6、span=(2, 5), match='shc'

7、span=(0, 0), match=''

表三常见正则表达式扩展表示法

优先级

符号

最高

“\”

“()” “(?:)” “(?=)” “[]”

“*”“+” “?”“{n}” “{n,}” “{n,m}”

“^” “$” “中介字符”

次最低

串接,即相邻字符连接在一起

最低

“|”

表四正则表达式特殊字符的优先级

正则表达式中有些字符具有特殊的含义,如果在匹配中要用到它本来的含义,需要进行转义,使用转义符'\'。而上述表二,可以看出有些字符自带反斜杠,如\d匹配数字。因此我们可以直接理解为: 如果'\'后面跟的字符不是ASCII数字或者ASCII字母,那么正则样式将直接匹配后面跟的字符,例如,.*\$$匹配任何以美元符号结尾的字符串。

3.正则表达式核心函数

Python 当前如何通过使用 re 模块来支持正则表达式,表五列出了来自 re 模块的更多常见函数。下面将介绍常用的函数

函数

描述

compile(pattern,flags = 0)

使用任何可选的标记来编译正则表达式的模式,然后返回一个正则表达式对象

match(pattern,string,flags=0)

尝试使用带有可选的标记的正则表达式的模式来匹配字符串。如果匹配成功,就返回匹配对象;如果失败,就返回None

search(pattern,string,flags=0)

使用可选标记搜索字符串中第一次出现的正则表达式模式。如果匹配成功,则返回匹配对象;如果失败,则返回None

findall(pattern,string [, flags] )

查找字符串中所有(非重复)出现的正则表达式模式,并返回一个匹配列表

finditer(pattern,string [, flags] )

与findall()函数相同,但返回的不是一个列表,而是一个迭代器。对于每一次匹配,迭代器都返回一个匹配对象

split(pattern,string,max=0)

根据正则表达式的模式分隔符,split 函数将字符串分割为列表,然后返回成功匹配的列表,分隔最多操作 max 次(默认分割所有匹配成功的位置)

sub(pattern,repl,string,count=0)

使用repl 替换所有正则表达式的模式在字符串中出现的位置,除非定义 count,否则就将替换所有出现的位置(另见 subn()函数,该函数返回替换操作的数目)

purge()

清除隐式编译的正则表达式模式

group(num=0)

返回整个匹配对象,或者编号为num 的特定子组

groups(default=None)

返回一个包含所有匹配子组的元组(如果没有成功匹配,则返回一个空元组)

groupdict(default=None)

返回一个包含所有匹配的命名子组的字典,所有的子组名称作为字典的键(如果没有成功匹配,则返回一个空字典)

表五常用的函数

3.1 compile()

当我们在Python中使用正则表达式时,re模块内部会干两件事情:①编译正则表达式,如果正则表达式的字符串本身不合法,会报错;②用编译后的正则表达式去匹配字符串。

那么如果一个正则表达式要重复使用几千次,出于效率的考虑,是不是应该先把这个正则先预编译好,接下来重复使用时就不再需要编译这个步骤了,直接匹配,提高效率,compile()就事干这个的,在模式匹配发生之前,正则表达式模式必须编译成正则表达式。

re.compile(pattern,flags )

pattern为一个字符串形式的正则表达式,

flag可选,表示匹配模式,见表六。

re.I、re.IGNORECASE

不区分大小写的匹配

re.L、re.LOCALE

根据所使用的本地语言环境通过\w、\W、\b、\B、\s、\S 实现匹配

re.M、re.MULTILINE

^和$分别匹配目标字符串中行的起始和结尾,而不是严格匹配整个字符串本身的起始和结尾

re.S、rer.DOTALL

“.”(点号)通常匹配除了\n(换行符)之外的所有单个字符;该标记表示

“.”(点号能够匹配全部字符

re.X、re.VERBOSE

通过反斜线转义,否则所有空格加上#(以及在该行中所有后续文字)都被忽略,除非在一个字符类中或者允许注释并且提高可读性

表六常用的模块属性

例子:

import re

m_token=r'\d+'

pattern=re.compile(m_token)

m = pattern.match('12twothree34four')

print(m)

输出结果:

<_sre.SRE_Match object; span=(0, 2), match='12'>

3.2 match()

match() 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 none。

re.match(pattern,string,flags)

pattern 匹配的正则表达式

string 要匹配的字符串。

flags 可选,表示匹配模式,见表六。

例子:

import re

m_token=r'\d+'

pattern=re.compile(m_token)

m1 = pattern.match('12twothree34four')

m2 = pattern.match('abc12twothree34four')

print(m1)

print(m2)

输出结果:

<_sre.SRE_Match object; span=(0, 2), match='12'>

None

说明,只有字符串起始开始匹配成功,才不返回None。

3.3 search()

其实,想要搜索的模式出现在一个字符串中间部分的概率,远大于出现在字符串起始部分的概率。这也就是search()派上用场的时候了。search()的工作方式与 match()完全一致,不同之处在于 search()会用它的字符串参数,在任意位置对给定正则表达式模式搜索第一次出现的匹配情况。如果搜索到成功的匹配,就会返回一个匹配对象;否则,返回 None。

re.search(pattern,string,flags)

pattern 匹配的正则表达式

string 要匹配的字符串。

flags 可选,表示匹配模式,见表六。

例子:

import re

m_token=r'\d+'

pattern=re.compile(m_token)

m1 = pattern.search('12twothree34four')

m2 = pattern.search('abc12twothree34four')

print(m1)

print(m2)

输出结果:

<_sre.SRE_Match object; span=(0, 2), match='12'>

<_sre.SRE_Match object; span=(3, 5), match='12'>

说明:通过比较match(),发现search()只要整个字符串有匹配成功就返回。

3.4 group()和 groups()

成功调用match()或者search()返回的对象为匹配对象,匹配对象有两个主要的方法:group()和groups()。group()方法用于获得一个或多个分组匹配的字符串,要么返回整个匹配对象,要么根据要求返回特定子组。当要获得整个匹配的子串时,可直接使用 group() 或 group(0)。groups()则仅返回一个包含 唯一或者全部子组的元组,等价于(m.group(1), m.group(2), ...)。

例子:

import re

line = "Cats are smarter than dogs"

matchObj1 = re.match(r'(.*) are (.*?) .*', line, re.M | re.I)

matchObj2 = re.match(r'(.*) are (.*?) (.*)', line, re.M | re.I)

print("matchObj1.group() : ", matchObj1.group())

print("matchObj2.group() : ", matchObj2.group())

print("matchObj1.groups() : ", matchObj1.groups())

print("matchObj2.groups() : ", matchObj2.groups())

输出结果:

matchObj1.group() : Cats are smarter than dogs

matchObj2.group() : Cats are smarter than dogs

matchObj1.groups() : ('Cats', 'smarter')

matchObj2.groups() : ('Cats', 'smarter', 'than dogs')

说明:matchObj1和matchObj2的区别在于.*是否为要求返回的特定子组,

因此matchObj1.groups() 只有两个元素 ('Cats', 'smarter'),

matchObj1.groups() 有三个元素 ('Cats', 'smarter', 'than dogs')。

3.5 findall()

findall()在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。

match()和 search()的不同之处在于,match 和 search 是匹配一次 findall 匹配所有。

re.findall(string,pos,endpos)

string : 待匹配的字符串。

pos : 可选参数,指定字符串的起始位置,默认为 0。

endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。

例子:

import re

pattern = re.compile(r'\d+') # 查找数字

result1 = pattern.findall('runoob 123 google 456')

result2 = pattern.findall('run88oob123google456', 0, 10)

print(result1)

print(result2)

输出结果:

['123', '456']

['88', '12']

例子:

import re

result = re.findall(r'(\w+)=(\d+)', 'set width=20 and height=10')

print(result)

输出结果:

[('width', '20'), ('height', '10')]

说明:实例2为多个匹配模式,返回元组列表。

finditer()函数是一个与 findall()函数类似但是更节省内存的变体,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

例子:

mport re

it = re.finditer(r"\d+","12a32bc43jf3")

print(it)

for a in it:

print(a)

输出结果:

<callable_iterator object at 0x0000021ED9214978>

<_sre.SRE_Match object; span=(0, 2), match='12'>

<_sre.SRE_Match object; span=(3, 5), match='32'>

<_sre.SRE_Match object; span=(7, 9), match='43'>

<_sre.SRE_Match object; span=(11, 12), match='3'>

说明:可以看出,it返回的是一个迭代器,可以提取匹配的内容。

3.6 sub()

sub()是将某字符串中所有匹配正则表达式的部分进行某种形式的替换。

re.sub(replacement, string, count)

replacement是被替换成的文本

string是需要被替换的文本

count是一个可选参数,指最大被替换的数量

例子:

import re

p = re.compile('(blue|white|red)')

print(p.sub('colour','blue socks and red shoes'))

print(p.sub('colour','blue socks and red shoes', count=1))

输出结果:

colour socks and colour shoes

colour socks and red shoes

说明:当添加了count=1只将blue替换成了colour,red没有被替换。

subn()方法执行的效果跟sub()一样,不过它会返回一个二维数组,包括替换后的新的字符串和总共替换的数量。

例子:

import re

p = re.compile('(blue|white|red)')

print(p.subn('colour','blue socks and red shoes'))

print(p.subn('colour','blue socks and red shoes', count=1))

输出结果:

('colour socks and colour shoes', 2)

('colour socks and red shoes', 1)

4.分组

分组就是用一对圆括号“()”括起来的正则表达式,匹配出的内容就表示一个分组。从正则表达式的左边开始看,看到的第一个左括号“(”表示第一个分组,第二个表示第二个分组,依次类推,需要注意的是,有一个隐含的全局分组(就是0),就是整个正则表达式。分完组以后,要想获得某个分组的内容,直接使用group(num)和groups()函数去直接提取就行。

例子:

import re

msg = '<html><h1>hello</h1></html>'

result = re.match(r'<([0-9a-zA-Z]+)><([0-9a-zA-Z]+)>(.+)</([0-9a-zA-Z]+)></([0-9a-zA-Z]+)>$', msg)

#result = re.match(r'<([0-9a-zA-Z]+)>(.+)</\1>$', msg)

print(result)

print(result.group(0))

print(result.group(1))

print(result.group(2))

print(result.group(3))

print(result.group(4))

print(result.group(5))

print(result.groups())

输出结果:

<_sre.SRE_Match object; span=(0, 27), match='<html><h1>hello</h1></html>'>

<html><h1>hello</h1></html>

html

h1

hello

h1

html

('html', 'h1', 'hello', 'h1', 'html')

说明:上述正则表达式中出现了5对(),因此分成了5组,通过groups()中5个元素也可看出。

命名分组:

(?P<name>正则表达式)#name是一个合法的标识符

引用分组:

(?P=name)

注意:P为大写!

例子:

import re

msg = '<html><h1>hello</h1></html>'

result = re.match(r'<(?P<fenzu>[0-9a-zA-Z]+)><([0-9a-zA-Z]+)>(.+)</([0-9a-zA-Z]+)></([0-9a-zA-Z]+)>', msg)

print(result)

print(result.groups())

输出结果:

<_sre.SRE_Match object; span=(0, 27), match='<html><h1>hello</h1></html>'>

('html', 'h1', 'hello', 'h1', 'html')

说明:([0-9a-zA-Z]+)写成(?P<fenzu>[0-9a-zA-Z]+),命名了一个分组fenzu,且仍是5个分组。

例子:

import re

msg = '<html><h1>hello</h1></html>'

result = re.match(r'<(?P<fenzu>[0-9a-zA-Z]+)><([0-9a-zA-Z]+)>(.+)</([0-9a-zA-Z]+)></(?P=fenzu)>', msg)

print(result)

print(result.groups())

输出结果:

<_sre.SRE_Match object; span=(0, 27), match='<html><h1>hello</h1></html>'>

('html', 'h1', 'hello', 'h1')

说明:将后面的([0-9a-zA-Z]+)写成了(?P=fenzu),引用了分组。但是此时,之前的第五个分组'html'因引用了第一个分组,因此只有4个分组。

5.贪婪和非贪婪

“贪婪”,尽可能多的匹配;“非贪婪”,尽可能少的匹配。默认情况下,正则表达式将进行贪婪匹配,加上?为将贪婪匹配模式转为非贪婪匹配模式。

例子:

import re

sentence = """You said "why?" and I say "I don't know"."""

print(re.findall(r'"(.*)"', sentence))

print(re.findall(r'"(.*?)"', sentence))

输出结果:

['why?" and I say "I don\'t know']

['why?', "I don't know"]

说明:贪婪匹配,从sentence中尽可能长的匹配两个””之间的内容,因此打印出整个字符串;加上了?,变成了非贪婪匹配,因此从sentence中尽可能短的匹配两个””之间的内容,匹配到了就输出,因此打印出两个匹配内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/344013.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ansible的安装及部署

目录 一、Ansible对于企业运维的重大意义 二、Ansible的安装 三、构建Ansible清单 1.直接书写受管主机名或ip&#xff0c;每行一个 2.设定受管主机的组[组名称] 四、Ansible配置文件参数详解 1、配置文件的分类与优先级 2.配置新用户的Ansible配置 3.生成免密认证 本章…

算法 ——世界 二

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。个人爱好: 编程&#xff0c;打篮球&#xff0c;计算机知识个人名言&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石…

Linux管道选取命令:cut、grep

选取命令就是将一段数据经过分析后&#xff0c;取出我们所想要的&#xff0c;或是经历分析关键词&#xff0c;取得我们所想要的那一行 一般来说&#xff0c;选取信息通常是针对一行一行来分析的&#xff0c;而不是整篇信息分析 下面介绍两个很常用的信息选取命令&#xff1a;…

Numpy基础与实例——人工智能基础——机器学习

文章目录一、Numpy概述1. 优势2. numpy历史3. Numpy的核心&#xff1a;多维数组4. 内存中的ndarray对象4.1 元数据&#xff08;metadata&#xff09;4.2 实际数据二、numpy基础1. ndarray数组2. arange、zeros、ones、zeros_like3. ndarray对象属性的基本操作3.1 修改数组维度3…

dubbo接口自动化用例性能优化

dubbo接口自动化用例性能优化 目录&#xff1a;导读 前言 优化本地调试时间 单用例执行时间的优化 提高并发 最后 前言 去年换了一个新部门&#xff0c;看了下当前的自动化用例的情况&#xff0c;发现存在三类性能问题&#xff1a; 本地调试运行时等待时间较长&#xf…

C++学习记录——팔 内存管理

文章目录1、动态内存管理2、内存管理方式operator new operator delete3、new和delete的实现原理1、动态内存管理 C兼容C语言关于内存分配的语法&#xff0c;而添加了C独有的东西。 //int* p1 (int*)malloc(sizeof(int));int* p1 new int;new是一个操作符&#xff0c;C不再需…

【工具】图片和PDF批量区域OCR识别图片文字并重命名,如何批量图片识别文字并将识别的文字改名该图片

前段时间接到一个棘手的难题&#xff08;识别图片文字&#xff0c;将图片文件名改成该文字&#xff09; 因为不解决就得手动挨个挨个输入然后把文件命名好 今天又一个文件需求是这样的 图上有姓名文字&#xff0c;要识别出来改成每一张图跟这个一样&#xff0c;有的人说了缩…

学习笔记——吴恩达《神经网络与深度学习》

神经网络与深度学习1. 基础知识神经网络用神经网络进行监督学习2. 神经网络基础知识二分分类logistic回归logistic回归损失函数梯度下降法导数计算图logistic回归中的梯度下降法m个样本的梯度下降向量化Python中的广播3. 浅层神经网络神经网络概述神经网络表示计算神经网络的输…

Android自动化测试——Monkey

本来是做Web后端的&#xff0c;来公司实习变成微信小程序前端了&#xff0c;到这周变成Android APP测试人员了&#xff0c;也是微醺啊。 由于对手工测试终究是有些抵触&#xff0c;所有昨天小试了一下不用写代码的自动化压力测试&#xff0c;在此记下我的心得。 一、Monkey与…

TOOM互联网舆情监测中心,互联网舆情监测系统为何出现以及由来?

互联网舆情监测中心是指负责收集、分析和评估互联网上的舆情信息的组织或机构&#xff0c;旨在帮助政府、企业、媒体和其他相关组织了解公众对特定话题的看法、情感和态度&#xff0c;并采取相应的措施应对和管理舆情事件&#xff0c;TOOM互联网舆情监测中心&#xff0c;互联网…

Hudi-集成Spark之spark-shell 方式

Hudi集成Spark之spark-shell 方式 启动 spark-shell &#xff08;1&#xff09;启动命令 #针对Spark 3.2 spark-shell \--conf spark.serializerorg.apache.spark.serializer.KryoSerializer \--conf spark.sql.catalog.spark_catalogorg.apache.spark.sql.hudi.catalog.Hoo…

leaflet 本地上传shp文件,在map上解析显示图形(058)

第058个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中本地上传shp文件,利用shapefile读取shp数据,并在地图上显示图形。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示例效果加载shapefile.js方式配置方式示例源代码(共126…

GBDT+LR

为什么需要GBDTLR 协同过滤和矩阵分解存在问题: 仅利用了用户与物品相互行为信息进行推荐&#xff0c; 忽视了用户自身特征&#xff0c; 物品自身特征以及上下文信息等&#xff0c;导致生成的结果往往会比较片面。 FFM 存在问题 FFM特征交叉能力有限&#xff1a;虽然 FFM 模型…

Excel里数字太长显示为科学计数法如何显示完整数字

Excel里数字太长显示为科学计数法如何显示完整数字 注意&#xff1a;以下测试都是在macos的Microsoft Excel for Mac的16.53版本中实际测试的&#xff0c;在windows中应该也是一样的。 一、问题描述 数字太长在Excel中会显示为E形式 有些值&#xff0c;比如身份证号、银行卡…

编译原理(第3版-王生原)课后习题答案-第三章

1.构造下列正规式相应的 DFA。(1)1(0|1) *101(2)1(1010* |1(010)*1) *0(3)a((a|b)* |ab*a)*b(4)b((ab)* bb)*ab答案&#xff1a;(2)(3)(4)略。 写1个(1)体现解题思路。2.已知 NFA ((x,yz),{0,1}M,{x},{z})&#xff0c;其中:M(x,0){z}, M(y,0){x,y}, M(z,0){x,z}, M(x,1){x}, M(…

Linux文件默认权限:umask

umask就是指定目前用户在建立文件或目录时候的权限默认值 查看方式有两种&#xff1a;一种可以直接输入umask&#xff0c;就可以看到数字类型的权限设置值&#xff0c;一种则是加入umask后加入-S&#xff08;Symbolic&#xff09;选项&#xff0c;就会以符号类型的方式来显示出…

HJY-E1A/4D AC220V数字式交流【电压继电器】

系列型号 HJY-2B-2H2D DC220V欠电压继电器 HJY-1A-2H2D DC220V过压继电器 一、用途 本系列电压继电器为瞬时动作特性&#xff0c;用于发电机&#xff0c;变压器&#xff0c;输电线路的继电保护装置中作为过压或欠压的闭锁启动元件。 二、特点 (1).采用拨盘设定;或数码管显…

Spring Batch ItemReader组件-读数据库

目录 引言 数据准备 游标方式 分页方式 转视频版 引言 接着上篇&#xff1a;Spring Batch ItemReader组件-Json文件&#xff0c;了解Spring Batch 读取Json文件后&#xff0c;接下来一起学习一下Spring Batch 如何读数据库中的数据 数据准备 下面是一张用户表user&…

UnityShader35:光晕光效

一、光晕逻辑 光晕的逻辑很简单&#xff0c;就是在屏幕上画上一个一个方形的 Mesh&#xff0c;然后采样带 Alpha 通道的光晕贴图&#xff0c;效果就出来了&#xff0c;其中方形 Mesh 的大小、位置、纹理表现全部都由美术配置&#xff0c;因此效果好坏主要取决于光晕贴图以及是…

ESP8266点亮 0.96 英寸 OLED 显示屏,基于Arduino IDE

本指南介绍如何使用 Arduino IDE 将 0.96 英寸 SSD1306 OLED 显示屏与 ESP8266 结合使用。我们将向您展示如何编写文本、设置不同的字体、绘制形状和显示位图图像。安装 SSD1306 OLED 库 – ESP8266有几个库可用于使用 ESP8266 控制 OLED 显示屏。在本教程中&#xff0c;我们将…