python正则表达式详解

2023-05-16

正则表达式是一个很强大的字符串处理工具,几乎任何关于字符串的操作都可以使用正则表达式来完成,作为一个爬虫工作者,每天和字符串打交道,正则表达式更是不可或缺的技能,正则表达式的在不同的语言中使用方式可能不一样,不过只要学会了任意一门语言的正则表达式用法,其他语言中大部分也只是换了个函数的名称而已,本质都是一样的。下面,我来介绍一下python中的正则表达式是怎么使用的。

  首先,python中的正则表达式大致分为以下几部分:

元字符
模式
函数
re 内置对象用法
分组用法
环视用法
  所有关于正则表达式的操作都使用 python 标准库中的 re 模块。

一、元字符 (参见 python 模块 re 文档)

. 匹配任意字符(不包括换行符)
^ 匹配开始位置,多行模式下匹配每一行的开始
$ 匹配结束位置,多行模式下匹配每一行的结束
* 匹配前一个元字符0到多次
+ 匹配前一个元字符1到多次
? 匹配前一个元字符0到1次
{m,n} 匹配前一个元字符m到n次
\ 转义字符,跟在其后的字符将失去作为特殊元字符的含义,例如\.只能匹配.,不能再匹配任意字符
[] 字符集,一个字符的集合,可匹配其中任意一个字符
| 逻辑表达式 或 ,比如 a|b 代表可匹配 a 或者 b
(…) 分组,默认为捕获,即被分组的内容可以被单独取出,默认每个分组有个索引,从 1 开始,按照”(“的顺序决定索引值
(?iLmsux) 分组中可以设置模式,iLmsux之中的每个字符代表一个模式,用法参见 模式 I
(?:…) 分组的不捕获模式,计算索引时会跳过这个分组
(?P…) 分组的命名模式,取此分组中的内容时可以使用索引也可以使用name
(?P=name) 分组的引用模式,可在同一个正则表达式用引用前面命名过的正则
(?#…) 注释,不影响正则表达式其它部分,用法参见 模式 I
(?=…) 顺序肯定环视,表示所在位置右侧能够匹配括号内正则
(?!…) 顺序否定环视,表示所在位置右侧不能匹配括号内正则
(?<=…) 逆序肯定环视,表示所在位置左侧能够匹配括号内正则
(?

output> ‘Hello World!’

在正则表达式中指定模式以及注释

regex = re.compile(“(?#注释)(?i)hello world!”)
print regex.match(s).group()

output> ‘Hello World!’

复制代码
L LOCALE, 字符集本地化。这个功能是为了支持多语言版本的字符集使用环境的,比如在转义符\w,在英文环境下,它代表[a-zA-Z0-9_],即所以英文字符和数字。如果在一个法语环境下使用,缺省设置下,不能匹配”é” 或 “ç”。加上这L选项和就可以匹配了。不过这个对于中文环境似乎没有什么用,它仍然不能匹配中文字符。
M MULTILINE,多行模式, 改变 ^ 和 $ 的行为
复制代码
s = ”’first line
second line
third line”’

^

regex_start = re.compile(“^\w+”)
print regex_start.findall(s)

output> [‘first’]

regex_start_m = re.compile(“^\w+”, re.M)
print regex_start_m.findall(s)

output> [‘first’, ‘second’, ‘third’]

$

regex_end = re.compile(“\w+$”)
print regex_end.findall(s)

output> [‘line’]

regex_end_m = re.compile(“\w+$”, re.M)
print regex_end_m.findall(s)

output> [‘line’, ‘line’, ‘line’]

复制代码
S  DOTALL,此模式下 ‘.’ 的匹配不受限制,可匹配任何字符,包括换行符
复制代码
s = ”’first line
second line
third line”’
#
regex = re.compile(“.+”)
print regex.findall(s)

output> [‘first line’, ‘second line’, ‘third line’]

re.S

regex_dotall = re.compile(“.+”, re.S)
print regex_dotall.findall(s)

output> [‘first line\nsecond line\nthird line’]

复制代码
X VERBOSE,冗余模式, 此模式忽略正则表达式中的空白和#号的注释,例如写一个匹配邮箱的正则表达式
email_regex = re.compile(“[\w+.]+@[a-zA-Z\d]+.(com|cn)”)

email_regex = re.compile(“”“[\w+.]+ # 匹配@符前的部分
@ # @符
[a-zA-Z\d]+ # 邮箱类别
.(com|cn) # 邮箱后缀 “”“, re.X)

U UNICODE,使用 \w, \W, \b, \B 这些元字符时将按照 UNICODE 定义的属性.
正则表达式的模式是可以同时使用多个的,在 python 里面使用按位或运算符 | 同时添加多个模式

如 re.compile(”, re.I|re.M|re.S)

每个模式在 re 模块中其实就是不同的数字

复制代码
print re.I

output> 2

print re.L

output> 4

print re.M

output> 8

print re.S

output> 16

print re.X

output> 64

print re.U

output> 32

复制代码
三、函数 (参见 python 模块 re 文档)

python 的 re 模块提供了很多方便的函数使你可以使用正则表达式来操作字符串,每种函数都有它自己的特性和使用场景,熟悉之后对你的工作会有很大帮助

compile(pattern, flags=0)
给定一个正则表达式 pattern,指定使用的模式 flags 默认为0 即不使用任何模式,然后会返回一个 SRE_Pattern (参见 第四小节 re 内置对象用法) 对象

regex = re.compile(“.+”)
print regex

output> <_sre.SRE_Pattern object at 0x00000000026BB0B8>

这个对象可以调用其他函数来完成匹配,一般来说推荐使用 compile 函数预编译出一个正则模式之后再去使用,这样在后面的代码中可以很方便的复用它,当然大部分函数也可以不用 compile 直接使用,具体见 findall 函数

复制代码
s = ”’first line
second line
third line”’
#
regex = re.compile(“.+”)

调用 findall 函数

print regex.findall(s)

output> [‘first line’, ‘second line’, ‘third line’]

调用 search 函数

print regex.search(s).group()

output> first lin

复制代码
escape(pattern)
转义 如果你需要操作的文本中含有正则的元字符,你在写正则的时候需要将元字符加上反斜扛 \ 去匹配自身, 而当这样的字符很多时,写出来的正则表达式就看起来很乱而且写起来也挺麻烦的,这个时候你可以使用这个函数,用法如下

复制代码
s = “.+\d123”
#
regex_str = re.escape(“.+\d123”)

查看转义后的字符

print regex_str

output> .+\d123

查看匹配到的结果

for g in re.findall(regex_str, s):
print g

output> .+\d123

复制代码
findall(pattern, string, flags=0)
参数 pattern 为正则表达式, string 为待操作字符串, flags 为所用模式,函数作用为在待操作字符串中寻找所有匹配正则表达式的字串,返回一个列表,如果没有匹配到任何子串,返回一个空列表。

复制代码
s = ”’first line
second line
third line”’

compile 预编译后使用 findall

regex = re.compile(“\w+”)
print regex.findall(s)

output> [‘first’, ‘line’, ‘second’, ‘line’, ‘third’, ‘line’]

不使用 compile 直接使用 findall

print re.findall(“\w+”, s)

output> [‘first’, ‘line’, ‘second’, ‘line’, ‘third’, ‘line’]

复制代码
finditer(pattern, string, flags=0)
参数和作用与 findall 一样,不同之处在于 findall 返回一个列表, finditer 返回一个迭代器(参见 http://www.cnblogs.com/huxi/archive/2011/07/01/2095931.html ), 而且迭代器每次返回的值并不是字符串,而是一个 SRE_Match (参见 第四小节 re 内置对象用法) 对象,这个对象的具体用法见 match 函数。

复制代码
s = ”’first line
second line
third line”’

regex = re.compile(“\w+”)
print regex.finditer(s)

output>

for i in regex.finditer(s):
print i

output> <_sre.SRE_Match object at 0x0000000002B7A920>

<_sre.SRE_Match object at 0x0000000002B7A8B8>

<_sre.SRE_Match object at 0x0000000002B7A920>

<_sre.SRE_Match object at 0x0000000002B7A8B8>

<_sre.SRE_Match object at 0x0000000002B7A920>

<_sre.SRE_Match object at 0x0000000002B7A8B8>

复制代码
match(pattern, string, flags=0)
使用指定正则去待操作字符串中寻找可以匹配的子串, 返回匹配上的第一个字串,并且不再继续找,需要注意的是 match 函数是从字符串开始处开始查找的,如果开始处不匹配,则不再继续寻找,返回值为 一个 SRE_Match (参见 第四小节 re 内置对象用法) 对象,找不到时返回 None

复制代码
s = ”’first line
second line
third line”’

compile

regex = re.compile(“\w+”)
m = regex.match(s)
print m

output> <_sre.SRE_Match object at 0x0000000002BCA8B8>

print m.group()

output> first

s 的开头是 “f”, 但正则中限制了开始为 i 所以找不到

regex = re.compile(“^i\w+”)
print regex.match(s)

output> None

复制代码
purge()
当你在程序中使用 re 模块,无论是先使用 compile 还是直接使用比如 findall 来使用正则表达式操作文本,re 模块都会将正则表达式先编译一下, 并且会将编译过后的正则表达式放到缓存中,这样下次使用同样的正则表达式的时候就不需要再次编译, 因为编译其实是很费时的,这样可以提升效率,而默认缓存的正则表达式的个数是 100, 当你需要频繁使用少量正则表达式的时候,缓存可以提升效率,而使用的正则表达式过多时,缓存带来的优势就不明显了 (参考 《python re.compile对性能的影响》http://blog.trytofix.com/article/detail/13/), 这个函数的作用是清除缓存中的正则表达式,可能在你需要优化占用内存的时候会用到。

search(pattern, string, flags=0)
函数类似于 match,不同之处在于不限制正则表达式的开始匹配位置

复制代码
s = ”’first line
second line
third line”’

需要从开始处匹配 所以匹配不到

print re.match(‘i\w+’, s)

output> None

没有限制起始匹配位置

print re.search(‘i\w+’, s)

output> <_sre.SRE_Match object at 0x0000000002C6A920>

print re.search(‘i\w+’, s).group()

output> irst

复制代码
split(pattern, string, maxsplit=0, flags=0)
参数 maxsplit 指定切分次数, 函数使用给定正则表达式寻找切分字符串位置,返回包含切分后子串的列表,如果匹配不到,则返回包含原字符串的一个列表

复制代码
s = ”’first 111 line
second 222 line
third 333 line”’

按照数字切分

print re.split(‘\d+’, s)

output> [‘first ‘, ’ line\nsecond ‘, ’ line\nthird ‘, ’ line’]

.+ 匹配不到 返回包含自身的列表

print re.split(‘.+’, s, 1)

output> [‘first 111 line\nsecond 222 line\nthird 333 line’]

maxsplit 参数

print re.split(‘\d+’, s, 1)

output> [‘first ‘, ’ line\nsecond 222 line\nthird 333 line’]

复制代码

sub(pattern, repl, string, count=0, flags=0)
替换函数,将正则表达式 pattern 匹配到的字符串替换为 repl 指定的字符串, 参数 count 用于指定最大替换次数

复制代码
s = “the sum of 7 and 9 is [7+9].”

基本用法 将目标替换为固定字符串

print re.sub(‘[7+9]’, ‘16’, s)

output> the sum of 7 and 9 is 16.

高级用法 1 使用前面匹配的到的内容 \1 代表 pattern 中捕获到的第一个分组的内容

print re.sub(‘[(7)+(9)]’, r’\2\1’, s)

output> the sum of 7 and 9 is 97.

高级用法 2 使用函数型 repl 参数, 处理匹配到的 SRE_Match 对象

def replacement(m):
p_str = m.group()
if p_str == ‘7’:
return ‘77’
if p_str == ‘9’:
return ‘99’
return ”
print re.sub(‘\d’, replacement, s)

output> the sum of 77 and 99 is [77+99].

高级用法 3 使用函数型 repl 参数, 处理匹配到的 SRE_Match 对象 增加作用域 自动计算

scope = {}
example_string_1 = “the sum of 7 and 9 is [7+9].”
example_string_2 = “[name = ‘Mr.Gumby’]Hello,[name]”

def replacement(m):
code = m.group(1)
st = ”
try:
st = str(eval(code, scope))
except SyntaxError:
exec code in scope
return st

解析: code=’7+9’

str(eval(code, scope))=’16’

print re.sub(‘[(.+?)]’, replacement, example_string_1)

output> the sum of 7 and 9 is 16.

两次替换

解析1: code=”name = ‘Mr.Gumby’”

eval(code)

raise SyntaxError

exec code in scope

在命名空间 scope 中将 “Mr.Gumby” 赋给了变量 name

解析2: code=”name”

eval(name) 返回变量 name 的值 Mr.Gumby

print re.sub(‘[(.+?)]’, replacement, example_string_2)

output> Hello,Mr.Gumby

复制代码
subn(pattern, repl, string, count=0, flags=0)
作用与函数 sub 一样, 唯一不同之处在于返回值为一个元组,第一个值为替换后的字符串,第二个值为发生替换的次数

template(pattern, flags=0)
这个吧,咋一看和 compile 差不多,不过不支持 +、?、*、{} 等这样的元字符,只要是需要有重复功能的元字符,就不支持,查了查资料,貌似没人知道这个函数到底是干嘛的…

  四、re 内置对象用法

SRE_Pattern 这个对象是一个编译后的正则表达式,编译后不仅能够复用和提升效率,同时也能够获得一些其他的关于正则表达式的信息
属性:

flags 编译时指定的模式
groupindex 以正则表达式中有别名的组的别名为键、以该组对应的编号为值的字典,没有别名的组不包含在内。
groups 正则表达式中分组的数量
pattern 编译时用的正则表达式
复制代码
s = ‘Hello, Mr.Gumby : 2016/10/26’
p = re.compile(”’(?: # 构造一个不捕获分组 用于使用 |
(?P\w+.\w+) # 匹配 Mr.Gumby
| # 或
(?P\s+.\w+) # 一个匹配不到的命名分组
)
.*? # 匹配 :
(\d+) # 匹配 2016
”’, re.X)

#
print p.flags

output> 64

print p.groupindex

output> {‘name’: 1, ‘no’: 2}

print p.groups

output> 3

print p.pattern

output> (?: # 构造一个不捕获分组 用于使用 |

(?P\w+.\w+) # 匹配 Mr.Gumby

| # 或

(?P\s+.\w+) # 一个匹配不到的命名分组

)

.*? # 匹配 :

(\d+) # 匹配 2016

复制代码

函数:可使用 findall、finditer、match、search、split、sub、subn 等函数

SRE_Match 这个对象会保存本次匹配的结果,包含很多关于匹配过程以及匹配结果的信息
属性:

endpos 本次搜索结束位置索引
lastgroup 本次搜索匹配到的最后一个分组的别名
lastindex 本次搜索匹配到的最后一个分组的索引
pos 本次搜索开始位置索引
re 本次搜索使用的 SRE_Pattern 对象
regs 列表,元素为元组,包含本次搜索匹配到的所有分组的起止位置
string 本次搜索操作的字符串
复制代码
s = ‘Hello, Mr.Gumby : 2016/10/26’
m = re.search(‘, (?P\w+.\w+).*?(\d+)’, s)

本次搜索的结束位置索引

print m.endpos

output> 28

本次搜索匹配到的最后一个分组的别名

本次匹配最后一个分组没有别名

print m.lastgroup

output> None

本次搜索匹配到的最后一个分组的索引

print m.lastindex

output> 2

本次搜索开始位置索引

print m.pos

output> 0

本次搜索使用的 SRE_Pattern 对象

print m.re

output> <_sre.SRE_Pattern object at 0x000000000277E158>

列表,元素为元组,包含本次搜索匹配到的所有分组的起止位置 第一个元组为正则表达式匹配范围

print m.regs

output> ((7, 22), (7, 15), (18, 22))

本次搜索操作的字符串

print m.string

output> Hello, Mr.Gumby : 2016/10/26

复制代码

函数:

end([group=0]) 返回指定分组的结束位置,默认返回正则表达式所匹配到的最后一个字符的索引
expand(template) 根据模版返回相应的字符串,类似与 sub 函数里面的 repl, 可使用 \1 或者 \g 来选择分组
group([group1, …]) 根据提供的索引或名字返回响应分组的内容,默认返回 start() 到 end() 之间的字符串, 提供多个参数将返回一个元组
groupdict([default=None]) 返回 返回一个包含所有匹配到的命名分组的字典,没有命名的分组不包含在内,key 为组名, value 为匹配到的内容,参数 default 为没有参与本次匹配的命名分组提供默认值
groups([default=None]) 以元组形式返回每一个分组匹配到的字符串,包括没有参与匹配的分组,其值为 default
span([group]) 返回指定分组的起止位置组成的元组,默认返回由 start() 和 end() 组成的元组
start([group]) 返回指定分组的开始位置,默认返回正则表达式所匹配到的第一个字符的索引
复制代码
s = ‘Hello, Mr.Gumby : 2016/10/26’
m = re.search(”’(?: # 构造一个不捕获分组 用于使用 |
(?P\w+.\w+) # 匹配 Mr.Gumby
| # 或
(?P\s+.\w+) # 一个匹配不到的命名分组
)
.*? # 匹配 :
(\d+) # 匹配 2016
”’,
s, re.X)

返回指定分组的结束位置,默认返回正则表达式所匹配到的最后一个字符的索引

print m.end()

output> 22

根据模版返回相应的字符串,类似与 sub 函数里面的 repl, 可使用 \1 或者 \g 来选择分组

print m.expand(“my name is \1”)

output> my name is Mr.Gumby

根据提供的索引或名字返回响应分组的内容,默认返回 start() 到 end() 之间的字符串, 提供多个参数将返回一个元组

print m.group()

output> Mr.Gumby : 2016

print m.group(1,2)

output> (‘Mr.Gumby’, None)

返回 返回一个包含所有匹配到的命名分组的字典,没有命名的分组不包含在内,key 为组名, value 为匹配到的内容,参数 default 为没有参与本次匹配的命名分组提供默认值

print m.groupdict(‘default_string’)

output> {‘name’: ‘Mr.Gumby’, ‘no’: ‘default_string’}

以元组形式返回每一个分组匹配到的字符串,包括没有参与匹配的分组,其值为 default

print m.groups(‘default_string’)

output> (‘Mr.Gumby’, ‘default_string’, ‘2016’)

返回指定分组的起止未知组成的元组,默认返回由 start() 和 end() 组成的元组

print m.span(3)

output> (18, 22)

返回指定分组的开始位置,默认返回正则表达式所匹配到的第一个字符的索引

print m.start(3)

output> 18

复制代码
五、分组用法

python 的正则表达式中用小括号 "(" 表示分组,按照每个分组中前半部分出现的顺序 "(" 判定分组的索引,索引从 1 开始,每个分组在访问的时候可以使用索引,也可以使用别名

复制代码
s = ‘Hello, Mr.Gumby : 2016/10/26’
p = re.compile(“(?P\w+.\w+).*?(\d+)(?#comment)”)
m = p.search(s)

使用别名访问

print m.group(‘name’)

output> Mr.Gumby

使用分组访问

print m.group(2)

output> 2016

复制代码
有时候可能只是为了把正则表达式分组,而不需要捕获其中的内容,这时候可以使用非捕获分组

复制代码
s = ‘Hello, Mr.Gumby : 2016/10/26’
p = re.compile(“””
(?: # 非捕获分组标志 用于使用 |
(?P\w+.\w+)
|
(\d+/)
)
“”“, re.X)
m = p.search(s)

使用非捕获分组

此分组将不计入 SRE_Pattern 的 分组计数

print p.groups

output> 2

不计入 SRE_Match 的分组

print m.groups()

output> (‘Mr.Gumby’, None)

复制代码
如果你在写正则的时候需要在正则里面重复书写某个表达式,那么你可以使用正则的引用分组功能,需要注意的是引用的不是前面分组的 正则表达式 而是捕获到的 内容,并且引用的分组不算在分组总数中.

复制代码
s = ‘Hello, Mr.Gumby : 2016/2016/26’
p = re.compile(“””
(?: # 非捕获分组标志 用于使用 |
(?P\w+.\w+)
|
(\d+/)
)
.*?(?P\d+)/(?P=number)/
“”“, re.X)
m = p.search(s)

使用引用分组

此分组将不计入 SRE_Pattern 的 分组计数

print p.groups

output> 3

不计入 SRE_Match 的分组

print m.groups()

output> (‘Mr.Gumby’, None, ‘2016’)

查看匹配到的字符串

print m.group()

output> Mr.Gumby : 2016/2016/

复制代码

六、环视用法

环视还有其他的名字,例如 界定、断言、预搜索等,叫法不一。

环视是一种特殊的正则语法,它匹配的不是字符串,而是 位置,其实就是使用正则来说明这个位置的左右应该是什么或者应该不是什么,然后去寻找这个位置。

环视的语法有四种,见第一小节元字符,基本用法如下。

复制代码
s = ‘Hello, Mr.Gumby : 2016/10/26 Hello,r.Gumby : 2016/10/26’

不加环视限定

print re.compile(“(?P\w+.\w+)”).findall(s)

output> [‘Mr.Gumby’, ‘r.Gumby’]

环视表达式所在位置 左边为 “Hello, “

print re.compile(“(?<=Hello, )(?P\w+.\w+)”).findall(s)

output> [‘Mr.Gumby’]

环视表达式所在位置 左边不为 “,”

print re.compile(“(?

output> [‘Mr.Gumby’]

环视表达式所在位置 右边为 “M”

print re.compile(“(?=M)(?P\w+.\w+)”).findall(s)

output> [‘Mr.Gumby’]

环视表达式所在位置 右边不为 r

print re.compile(“(?!r)(?P\w+.\w+)”).findall(s)

output> [‘Mr.Gumby’]

复制代码
高级一些的例子参见《正则基础之——环视(Lookaround)》(http://www.cnblogs.com/kernel0815/p/3375249.html)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python正则表达式详解 的相关文章

  • Pygame 让精灵按照给定的旋转行走

    很久以前我做了一个Scratch脚本 我想用Pygame将其转换为Python 有很多示例显示图像的旋转 但我想知道如何更改精灵的旋转以使其沿给定方向移动 而不更改图像 这是我的暂存代码 这是我的 Pygame 精灵类 class Star
  • Pandas 在列级别连接数据帧时添加键

    根据 Pandas 0 19 2 文档 我可以提供keys参数来创建结果多索引 DataFrame 一个例子 来自 pandas 文档 是 result pd concat frames keys x y z 我将如何连接数据框以便我可以在
  • Seaborn regplot 中点和线的不同颜色

    中列出的所有示例西伯恩的regplot文档 https seaborn pydata org generated seaborn regplot html点和回归线显示相同的颜色 改变color争论改变了两者 如何为点设置与线不同的颜色 你
  • 从 Python 将分层 JSON 数据写入 Excel xls?

    我想将一些数据从 python 写入 xlsx 我目前将其存储为 JSON 但它从 Python 中输出什么并不重要 单个文章的 JSON 如下所示 Word Count 50 Key Words Blah blah blah Foo Fr
  • 如何在seaborn中绘制离散变量的分布图

    当我画画的时候displot对于离散变量 分布可能不像我想象的那样 例如 We can find that there are crevices in the barplot so that the curve in kdeplot is
  • 将相同的 Patch 实例添加到 matplotlib 中的多个子图中

    我正在尝试将补丁的相同实例添加到 matplotlib 中的多个轴 这是最小的例子 import matplotlib pyplot as mpl plt import matplotlib patches as mpl patches f
  • 在Python中清理属于不同语言的文本

    我有一个文本集合 其中的句子要么完全是英语 印地语或马拉地语 每个句子附加的 id 为 0 1 2 分别代表文本的语言 无论任何语言的文本都可能有 HTML 标签 标点符号等 我可以使用下面的代码清理英语句子 import HTMLPars
  • 从 Spark 数据帧中过滤大量 ID

    我有一个大型数据框 其格式类似于 ID Cat date 12 A 201602 14 B 201601 19 A 201608 12 F 201605 11 G 201603 我需要根据大约 500 万个 Is 的列表来过滤行 最直接的方
  • 如何在python mechanize中设置cookie

    向服务器发送请求后 br open http xxxx br select form nr 0 br form MESSAGE 1 2 3 4 5 br submit 我得到了响应标题 其中包含 set cookie Set Cookie
  • Python 在 64 位 vista 上获取 os.environ["ProgramFiles"] 的错误值

    Vista64 计算机上的 Python 2 4 3 环境中有以下2个变量 ProgramFiles C Program Files ProgramFiles x86 C Program Files x86 但是当我运行以下命令时 impo
  • Scapy:如何将新层(802.1q)插入现有数据包?

    我有一个数据包转储 想要将 VLAN 标记 802 1q 标头 注入到数据包中 怎么做 为了找到答案 我查看了Scapy 插入新层和记录问题 https stackoverflow com q 17259592 1381638 这确实很有帮
  • 如何使用 numpy 从一维数组创建对角矩阵?

    我正在使用 Python 和 numpy 来做线性代数 我表演了numpy对矩阵进行 SVD 以获得矩阵 U i 和 V 然而 i 矩阵表示为 1 行的 1x4 矩阵 IE 12 22151125 4 92815942 2 06380839
  • 在 Python 中将嵌套字典位置作为参数传递

    如果我有一个嵌套字典 我可以通过索引来获取键 如下所示 gt gt gt d a b c gt gt gt d a b c 我可以将该索引作为函数参数传递吗 def get nested value d path a b return d
  • 如何使用 Python 实现并行 gzip 压缩?

    使用python压缩大文件 https stackoverflow com questions 9518705 big file compression with python给出了一个很好的例子来说明如何使用例如bz2 纯粹用 Pytho
  • 向结构化 numpy 数组添加字段

    将字段添加到结构化 numpy 数组的最简洁方法是什么 是否可以破坏性地完成 或者是否有必要创建一个新数组并复制现有字段 每个字段的内容是否连续存储在内存中 以便可以有效地完成此类复制 如果您使用 numpy 1 3 还有 numpy li
  • 如何输入可变的默认参数

    Python 中处理可变默认参数的方法是将它们设置为无 https stackoverflow com a 366430 5049813 例如 def foo bar None bar if bar is None else bar ret
  • 如何正确将 tflite_graph.pb 转换为 detector.tflite

    我正在使用tensorflow对象检测API使用tensorflow中的ssdlite mobilenet v2 coco 2018 05 09来训练自定义模型模型动物园 https github com tensorflow models
  • scikit-learn kmeans 聚类的初始质心

    如果我已经有一个可以作为初始质心的 numpy 数组 我该如何正确初始化 kmeans 算法 我正在使用 scikit learn Kmeans 类 这个帖子 具有选定初始中心的 k 均值 https stackoverflow com q
  • 如何从 python 中的字符串中删除 ANSI 转义序列

    这是包含我的字符串的片段 ls r n x1b 00m x1b 01 31mexamplefile zip x1b 00m r n x1b 01 31m 该字符串是从我执行的 SSH 命令返回的 我无法使用当前状态下的字符串 因为它包含 A
  • 具有重复值的 Sqlite 列

    就说专栏吧aSQLite 数据库的非常重复 始终有相同的 4 个值 其他值可能稍后出现 但不同值的数量将少于 1000 个 VALUES hello world it s a shame to store this str many tim

随机推荐

  • 优先级队列(堆)

    优先级队列 1 什么是优先级队列2 什么时候用它什么时候不用它3 它的具体用法记得import两个库 xff1a 3 1定义3 2输入输出 1 什么是优先级队列 优先级队列就是用库内已有的类 xff0c 这个类名字是队列 xff0c 其实不
  • 2.1 关系模型的基本概念

    文章目录 2 1 1 基本术语定义2 1 用二维表格表示实体集 xff0c 用关键码表示实体间联系的数据模型称为关系模型 xff08 relational Model xff09 在关系模型中 xff0c 关键码 key 简称键 由一个或多
  • 2.2 关系代数的五个基本操作

    文章目录 前言2 2 关系代数2 2 1 关系代数的五个基本操作 1 投影 xff08 Projection xff09 2 选择 xff08 Selection xff09 选择与投影组合 3 xff09 并 xff08 Union xf
  • web的一些介绍

    文章目录 前言一 什么是Web xff1f 二 基本Web服务结构软件编程体系C S xff08 Client Server xff09 软件体系结构B S xff08 Brower Server xff09 软件体系结构C S结构与B S
  • .net技术第一章

    文章目录 NETC C Sharp 的特点C 的应用范围 NET Framework1 2 创建简单的C 程序结构和书写规则类型的声明和使用类型的声明和使用命名空间使用方法命名空间举例 注释Main方法命令行参数Main返回值 控制台输入和
  • .net----委托和事件

    委托和事件 委托声明实例化调用将类型安全的函数指针 方法 作为其他方法的参数进行传递 xff0c 从而实现函数回调方法委托 xff1a 匿名方法委托 多播委托委托 xff1a 委托的异步调用委托 xff1a 委托的兼容性 事件事件实际上是委
  • .net-----语言集成查询LINQ

    语言集成查询LINQ 前言相关语言要素初始值设定项匿名类型相关语言要素Lambda表达式扩展方法 LINQ的概念和基本操作集成语言查询LINQLINQ查询操作 标准查询运算符数据排序数据筛选数据投影数据分组联接运算数据分区限定运算聚合运算集
  • .net-----Windows 窗体应用程序包括控件,对话框,多重窗体,绘制图形,菜单和工具栏

    目录 前言Windows窗体应用程序概述 xff1b 窗体和大部分控件常用的事件创建Windows窗体应用程序使用Visual Studio集成开发环境实现Hello World程序 使用常用Windows窗体控件 xff1b Label
  • python字符串内建函数

    在八进制数前面显示零 0 xff0c 在十六进制前面显示 0x 或者 0X 取决于用的是 x 还是 X 0 显示的数字前面填充 0 而不是默认的空格 输出一个单一的 var 映射变量 字典参数 m n m 是显示的最小总宽度 n 是小数点后
  • 物理层-计算机网络速成

    物理层 1 物理层的基本概念1 1四大特性机械特性电气特性功能特性过程特性 1 2两种信号1 3 调制编码调制编码区别 1 4 传输介质双绞线光纤同轴电缆 xff1a 淘汰 xff0c 有线电话无线 xff1a IEEE802 11 1 5
  • 考研第一天,汤家凤基础班,连续与极限复习笔记

    函数连续极限 性质保号性证明极值点 xff1a 夹逼准则二项式展开根号下 xff0c 大于一 xff0c 小于一的讨论直接放缩求和分子分母齐次 xff0c 且分母大一次 xff0c 用积分 单调有界存在极限几个重要的切线放缩证明有界 xff
  • Ubuntu双系统安装教程

    安装Ubuntu双系统 1 下载Ubuntu镜像源文件2 下载制作U盘启动工具3 磁盘分区4 安装Ubuntu 1 下载Ubuntu镜像源文件 18 04 6链接 xff1a http mirrors aliyun com ubuntu r
  • Arduino造轮子—红外遥控器

    今天练习的程序是实现红外遥控器的控制 xff0c 首先 xff0c 通过太极创客的视频来看看最终的实现结果 xff1a 太极创客 零基础入门学用Arduino 第三部分 智能应用篇 合辑 本次程序例程来自太极创客官网 xff0c 此平台的A
  • 嵌入式软件刷题日记【第一天】

    1 什么是同步IO xff0c 什么是异步IO 同步就是在发出一个功能调用时 xff0c 会一直阻塞等地结果 异步就是在发出一个功能调用时 xff0c 无需阻塞等待结果 xff0c 当结果产生一般通过状态 xff0c 回调等方法来通知调用者
  • 嵌入式软件刷题笔记【第四天】

    1 头文件的两种包含形式的区别 xff1f lt gt 尖括号形式表示引用系统编译器类库路径里面的头文件 34 34 双引号则表示引用当前文件工作目录相对路径里面的头文件 2 STM32 中断是怎么进入到中断服务程序的 xff1f STM3
  • 嵌入式软件刷题【第五天】

    1 在请求分页式存储管理中 xff0c 假设一次内存访问时间为 100ns xff0c 一次快表 xff08 TLB xff09 访问时间为 20ns xff0c 地址转换计算时的快表命中率为 80 xff0c 请计算平均有效内存访问时间为
  • OSlab

    OSlab B站链接 xff1a https www bilibili com video BV1kU4y1m7QW share source 61 copy web Linux环境实践作业 在Windows Terminal的Ubuntu
  • Linux操作命令学习笔记

    Linux操作命令学习笔记 常用操作命令 xff08 以下均严格区分大小写 xff09 查看文件以及文件夹 xff1a ls命令 ls a xff08 显示隐含文件 xff0c 如以 开头的文件 ls l 长格式输出 xff0c 和ll命令
  • JAVA与C、C++比较

    浅比较Java与C C 43 43 1 语言类型 C C 43 43 是Compiled Language xff0c 而Java兼顾了Compiled Language和Interpreted Language的特点 C C 43 43
  • python正则表达式详解

    正则表达式是一个很强大的字符串处理工具 xff0c 几乎任何关于字符串的操作都可以使用正则表达式来完成 xff0c 作为一个爬虫工作者 xff0c 每天和字符串打交道 xff0c 正则表达式更是不可或缺的技能 xff0c 正则表达式的在不同