【Python】Python 模式匹配与正则表达式

2023-11-20

Python 模式匹配与正则表达式

1. 模式匹配与正则表达式

你可能熟悉文本查找,即按下Ctrl-F,输入你要查找的词。 “正则表达式”更进一步,它们让你指定要查找的“模式”。 你也许不知道一家公司的准确电话号码,但如果你住在美国或加拿大, 你就知道它有3位数字,然后是一个短横线,然后是4位数字(有时候以3位区号开始)。 因此作为一个人,你看到一个电话号码就知道: 415-555-1234 是电话号码,但 4,155,551,234 不是。

正则表达式很有用,但如果不是程序员,很少会有人了解它, 尽管大多数现代文本编辑器和文字处理器(诸如微软的Word或OpenOffice/LibreOffcie), 都有查找和查找替换功能,可以根据正则表达式查找。 正则表达式可以节约大量时间,不仅适用于软件用户,也适用于程序员。 实际上,技术作家Cory Doctorow声称,甚至应该在教授编程之前,先教授正则表达式:

“知道[正则表达式]可能意味着用3步解决一个问题, 而不是用3000步。如果你是一个技术怪侠, 别忘了你用几次击键就能解决的问题, 其他人需要数天的烦琐工作才能解决, 而且他们容易犯错。”

在本章中,你将从编写一个程序开始,先不用正则表达式来寻找文本模式。 然后再看看,使用正则表达式让代码变得多么简洁。 我将展示用正则表达式进行基本匹配,然后转向一些更强大的功能,诸如字符串替换, 以及创建你自己的字符类型。

1.1. 不用正则表达式来查找文本模式

假设你希望在字符串中查找电话号码。你知道模式:3个数字, 一个短横线,3个数字,一个短横线,再是4个数字。 例如:415-555-4242。

假定我们用一个名为 isPhoneNumber() 的函数, 来检查字符串是否匹配模式,它返回 True 或 False 。 打开一个新的文件编辑器窗口,输入以下代码, 然后保存为 isPhoneNumber.py :

def isPhoneNumber(text):
if len(text) !=12:
return False
for i in range(3):
if not text[i].isdecimal():
return False
if text[3]!=‘-’:
return False
for i in range(4,7):
if not text[i].isdecimal():
return False
if text[7] != ‘-’:
return False
for i in range(8,12):
if not text[i].isdecimal():
return False
return True
print(‘415-555-4242 is a phone number:’)
print(isPhoneNumber(‘415-555-4242’))
print(‘Moshi moshi is a phone number:’)
print(isPhoneNumber(‘Moshi moshi’))
415-555-4242 is a phone number:
True
Moshi moshi is a phone number:
False
isPhoneNumber() 函数的代码进行几项检查, 看看 text 中的字符串是不是有效的电话号码。 如果其中任意一项检查失败,函数就返回 False 。 代码首先检查该字符串是否刚好有12个字符。 然后它检查区号(就是 text 中的前3个字符)是否只包含 数字。函数剩下的部分检查该字符串是否符合电话号码的模式: 号码必须在区号后出现第一个短横线), 3个数字,然后是另一个短横线,最后是4个数字。 如果程序执行通过了所有的检查,它就返回 True 。

用参数 ‘415-555-4242’ 调用 isPhoneNumber() 将返回真。 用参数 ‘Moshimoshi’ 调用 isPhoneNumber() 将返回假, 第一项测试失败了,因为不是12个字符。

必须添加更多代码,才能在更长的字符串中寻找这种文本模式。 用下面的代码, 替代 isPhoneNumber.py 中最后4个 print() 函数调用:

message=‘Call me at 415-555-1011 tomorrow.415-555-9999 is my office.’
for i in range(len(message)):
chunk=message[i:i+12]
if isPhoneNumber(chunk):
print(‘Phone number found:’ + chunk)
print(‘Done’)
Phone number found:415-555-1011
Phone number found:415-555-9999
Done
该程序运行时,输出看起来像这样:

在 for 循环的每一次迭代中, 取自 message 的一段新的12个字符被赋给变量 chunk() 。 例如,在第一次迭代, i 是 0 , chunk 被赋值为 message[0:12] (即字符串’Call me at 4’)。在下一次迭代, i 是1, chunk 被赋值为 message[1:13] (字符串 ‘all me at 41’ )。

将 chunk 传递给 isPhoneNumber(), 看看它是否符合电话号码的模式。如果符合, 就打印出这段文本。

继续遍历 message ,最终 chunk 中的12个字符会是一个电话号码。 该循环遍历了整个字符串,测试了每一段12个字符, 打印出所有满足 isPhoneNumber() 的 chunk 。 当我们遍历完 message ,就打印出 Done 。

在这个例子中,虽然 message 中的字符串很短, 但它也可能包含上百万个字符,程序运行仍然不需要一秒钟。 使用正则表达式查找电话号码的类似程序, 运行也不会超过一秒钟,但用正则表达式编写这类程序会快得多。

1.2. 用正则表达式查找文本模式

如果你想在有分机的电话号码中快速查找电话号,例如415-555-4242 x99,该怎么办呢?

正则表达式,又称规则表达式,英语简称为 regex,是文本模式的描述方法,能帮助你方便的检查一个字符串是否与某种模式匹配。

例如,\d 是一个正则表达式,表示一位数字字符, 即任何一位0到9的数字。 Python 使用正则表达式 \d\d\d-\d\d\d-\d\d\d\d , 来匹配前面 isPhoneNumber()函数匹配的同样文本: 3个数字、一个短横线、3个数字、一个短横线、4个数字。 所有其他字符串都不能匹配 \d\d\d-\d\d\d-\d\d\d\d 正则表达式。

但正则表达式可以复杂得多。例如, 在一个模式后加上花括号包围的3 ({3}), 就是说,“匹配这个模式3次”。 所以较短的正则表达式 \d{3}-\d{3}-\d{4} , 也匹配正确的电话号码格式。

1.2.1. 创建正则表达式对象

Python 中所有正则表达式的函数都在 re 模块中。在交互式环境中输入以下代码,导入该模块:

import re
re 模块的 compile() 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。 该对象拥有一系列方法用于正则表达式匹配和替换。 例如,向 re.compile() 传入一个字符串值表示正则表达式, 它将返回一个 Regex 模式对象(简称为 Regex 对象)。

要创建一个 Regex 对象来匹配电话号码模式, 就在交互式环境中输入以下代码。

regobj = re.compile(‘\d\d\d-\d\d\d-\d\d\d\d’)
现在 regobj 变量包含了一个 Regex 对象。

1.2.2. 匹配 Regex 对象

Regex 对象的 search() 方法查找传入的字符串,寻找该正则表达式的所有匹配。 如果字符串中没有找到该正则表达式模式,search() 方法将返回None 。 如果找到了该模式,search() 方法将返回一个 Match 对象。 Match 对象有一个 group() 方法,它返回被查找字符串中实际匹配的文本。 例如,在交互式环境中输入以下代码:

mo = regobj.search(‘My number is 415-555-4242.’)
print('Phone number found: ’ + mo.group())
Phone number found: 415-555-4242
变量名 mo 是一个通用的名称,用于 Match 对象。

这里,我们将期待的模式传递给 re.compile() ,并将得到的 Regex 对象保存在 phoneNumRegex 中。 然后我们在 phoneNumRegex 上调用 search() ,向它传入想查找的字符串。查找的结果保存在变量 mo 中。 在这个例子里,我们知道模式会在这个字符串中找到,所以我们知道会返回一个 Match 对象。 知道 mo 包含一个 Match 对象,而不是空值 None ,我们就可以在 mo 变量上调用 group() ,返回匹配的结果。 将 mo.group() 写在打印语句中,显示出完整的匹配,即 415-555-4242 。

如果对象没找到,可以进行判断:

mo2 = regobj.search(‘my number is 41555433.’)
print(‘got’) if mo2 else print(‘not got’)
not got
向 re.compile() 传递原始字符串
回忆一下, Python 中转义字符使用倒斜杠()。 字符串 V 表示一个换行字符, 而不是倒斜杠加上一个小写的 n 。 你需要输入转义字符 \ ,才能打印出一个倒斜杠。 所以 ‘\n’ 表示一个倒斜杠加上一个小写的 n 。 但是,通过在字符串的第一个引号之前加上 r , 可以将该字符串标记为原始字符串,它不包括转义字符。

因为正则表达式常常使用倒斜杠, 向 re.compile() 函数传入原始字符串就很方便, 而不是输入额外得到斜杠。输入 r’\d\d\d-\d\d\d-\d\d\d\d’ , 比输入 ‘\d\d\d-\d\d\d-\d\d\d\d’ 要容易得多。

1.2.3. 正则表达式匹配复习

虽然在 Python中使用正则表达式有几个步骤, 但每一步都相当简单。

用 import re 导入正则表达式模块。

用 re.compile() 函数创建一个 Regex 对象(记得使用原始字符串)。

向 Regex 对象的 search() 方法传入想查找的字符串。它返回一个 Match 对象。

调用 Match 对象的 group() 方法,返回实际匹配文本的字符串。

下面主要介绍Python中常用的正则表达式处理函数。

1.2.4. re.match函数

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

函数语法:

re.match(pattern, string, flags=0)
函数参数说明:

pattern 匹配的正则表达式

string 要匹配的字符串。

flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

我们可以使用 group(num) 或 groups() 匹配对象函数来获取匹配表达式。

group(num=0) 匹配的整个表达式的字符串, group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。

groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

实例 1:

在起始位置匹配

print(re.match(‘www’, ‘www.runoob.com’).span())
(0, 3)
不在起始位置匹配

print(re.match(‘com’, ‘www.runoob.com’))
None

1.2.5. re.search方法

re.search 扫描整个字符串并返回第一个成功的匹配。

函数语法:

re.search(pattern, string, flags=0)
函数参数说明:

参数 | 描述

pattern | 匹配的正则表达式

string | 要匹配的字符串。

flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

匹配成功 re.search 方法返回一个匹配的对象,否则返回None。

我们可以使用 group(num) 或 groups() 匹配对象函数来获取匹配表达式。

匹配对象方法 | 描述

group(num=0) |匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。

groups() | 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

实例 1:

在起始位置匹配

print(re.search(‘www’, ‘www.runoob.com’).span())
(0, 3)
不在起始位置匹配

print(re.search(‘com’, ‘www.runoob.com’).span())
(11, 14)
实例 2:

import re

line = “Cats are smarter than dogs”;

searchObj = re.search(‘(.) are (.?) .*’, line, re.M|re.I)

if searchObj:
print ("searchObj.group() : ", searchObj.group())
print ("searchObj.group(1) : ", searchObj.group(1))
print ("searchObj.group(2) : ", searchObj.group(2))
else:
print (“Nothing found!!”)
searchObj.group() : Cats are smarter than dogs
searchObj.group(1) : Cats
searchObj.group(2) : smarter
instr = ‘/home/bk/book-rst/doculet/sphinx-tutorial/runoob-src/pt01_language_eb00kh’
re_book = re.compile(‘eb\d\d…’)
uu = re_book.search(instr)
uu.span()
(67, 73)
dir(uu)
[‘class’,
class_getitem’,
copy’,
deepcopy’,
delattr’,
dir’,
doc’,
eq’,
format’,
ge’,
getattribute’,
getitem’,
getstate’,
gt’,
hash’,
init’,
init_subclass’,
le’,
lt’,
module’,
ne’,
new’,
reduce’,
reduce_ex’,
repr’,
setattr’,
sizeof’,
str’,
subclasshook’,
‘end’,
‘endpos’,
‘expand’,
‘group’,
‘groupdict’,
‘groups’,
‘lastgroup’,
‘lastindex’,
‘pos’,
‘re’,
‘regs’,
‘span’,
‘start’,
‘string’]
uu.group()
‘eb00kh’

1.2.6. re.match 与 re.search 的区别

re.match 只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None ; 而 re.search 匹配整个字符串,直到找到一个匹配。

实例:

import re

line = “Cats are smarter than dogs”;

matchObj = re.match( ‘dogs’, line, re.M|re.I)
if matchObj:
print ("match --> matchObj.group() : ", matchObj.group())
else:
print (“No match!!”)

matchObj = re.search( r’dogs’, line, re.M|re.I)
if matchObj:
print ("search --> matchObj.group() : ", matchObj.group())
else:
print (“No match!!”)
No match!!
search --> matchObj.group() : dogs

1.2.7. 检索和替换

Python 的re模块提供了re.sub用于替换字符串中的匹配项。

语法:

re.sub(pattern, repl, string, count=0)
参数:

pattern : 正则中的模式字符串。

repl : 替换的字符串,也可为一个函数。

string : 要被查找替换的原始字符串。

count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

实例:

#!/usr/bin/python3
import re

phone = “2004-959-559 # 这是一个电话号码”

删除注释

num = re.sub(‘#.*$’, “”, phone)
print ("电话号码 : ", num)

移除非数字的内容

num = re.sub(‘\D’, “”, phone)
print ("电话号码 : ", num)
电话号码 : 2004-959-559
电话号码 : 2004959559

1.2.8. repl 参数是一个函数

以下实例中将字符串中的匹配的数字乘于 2:

#!/usr/bin/python

import re

将匹配的数字乘于 2

def double(matched):
value = int(matched.group(‘value’))
return str(value * 2)

s = ‘A23G4HFD567’
print(re.sub(‘(?P\d+)’, double, s))
A46G8HFD1134

1.2.9. 正则表达式修饰符 - 可选标志

正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:

修饰符 | 描述

re.I 使匹配对大小写不敏感

re.L 做本地化识别(locale-aware)匹配

re.M 多行匹配,影响 ^ 和 $

re.S 使 . 匹配包括换行在内的所有字符

re.U 根据Unicode字符集解析字符。这个标志影响 \w , \W , \b , \B .

re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

1.2.10. 正则表达式模式

模式字符串使用特殊的语法来表示一个正则表达式:

字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。

多数字母和数字前加一个反斜杠时会拥有不同的含义。

标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。

反斜杠本身需要使用反斜杠转义。

由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。 模式元素(如 r’/t’ ,等价于’//t’ )匹配相应的特殊字符。

下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。

模式 | 描述

^ 匹配字符串的开头

$ 匹配字符串的末尾。

. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。

[…] 用来表示一组字符,单独列出: [amk] 匹配 ‘a’,‘m’或’k’

[^…] 不在[]中的字符: [^abc] 匹配除了a,b,c之外的字符。

re* 匹配0个或多个的表达式。

re+ 匹配1个或多个的表达式。

re? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式

re{ n}

re{ n,} 精确匹配n个前面表达式。

re{ n, m} 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式

a|b 匹配a或b

(re) G匹配括号内的表达式,也表示一个组

(?imx) 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。

(?-imx) 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。

(?: re) 类似 (…), 但是不表示一个组

(?imx:re) 在括号中使用i, m, 或 x 可选标志

(?-imx: re) 在括号中不使用i, m, 或 x 可选标志

(?#…) 注释.

(?= re) 前向肯定界定符。如果所含正则表达式,以 … 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。

(?! re) 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功

(?> re) 匹配的独立模式,省去回溯。

\w 匹配字母数字

\W 匹配非字母数字

\s 匹配任意空白字符,等价于 [\t\n\r\f] .

\S 匹配任意非空字符

\d 匹配任意数字,等价于 [0-9] .

\D 匹配任意非数字

\A 匹配字符串开始

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

\z 匹配字符串结束

\G 匹配最后匹配完成的位置。

\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, er\b 可以匹配 never 中的 er , 但不能匹配 verb 中的 er 。

\B 匹配非单词边界。‘er:raw-latex:B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。

\n, \t , 等. 匹配一个换行符。匹配一个制表符。等

\1…\9 匹配第n个分组的内容。

\10 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。

正则表达式符号复习
本章介绍了许多表示法,所以这里快速复习一下学到的内容:

? 匹配零次或一次前面的分组。

  • 匹配零次或多次前面的分组。

+匹配一次或多次前面的分组。

{n}匹配 n 次前面的分组。

{n,} 匹配 n 次或更多前面的分组。

{,m} 匹配零次到 m 次前面的分组。

{n,m}匹配至少 n 次、至多 m 次前面的分组。

{n,m}? 或 *? 或 +? 对前面的分组进行非贪心匹配。

^spam 意味着字符串必须以 spam 开始。

spam$意味着字符串必须以 spam 结束。

.匹配所有字符,换行符除外。

\d 、 \w和\s 分别匹配数字、单词和空格。

\D、\W和 \S分别匹配出数字、单词和空格外的所有字符。

[abc] 匹配方括号内的任意字符(诸如a、b或c)。

[^abc] 匹配不在方括号内的任意字符。

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

【Python】Python 模式匹配与正则表达式 的相关文章

  • 使用 InlineKeyboardButton python telegram bot 发送命令

    在Python电报机器人中 是否有可能InlineKeyboardButton发送类似命令 cancel当它被按下时 例如 当用户按下取消按钮时 他们将自动发送 cancel 命令 然后由机器人处理 从这里的例子来看 https githu
  • AttributeError:'function'对象在pandas中没有属性'bar'

    我有一个 pandas 数据框 它是 pandas 数据框类型 如下所示 type df Out 176 pandas core frame DataFrame 但是 当我尝试在此数据框上使用任何绘图函数 如条形图 时 会出现如下错误 df
  • 分配列表的多个值

    我很想知道是否有一种 Pythonic 方式将列表中的值分配给元素 为了更清楚 我要求这样的事情 myList 3 5 7 2 a b c d something myList So that a 3 b 5 c 7 d 2 我正在寻找比手
  • 区分大小写的实体识别

    我的关键字全部以小写形式存储 例如 折扣耐克鞋 我正在尝试对其执行实体提取 我遇到的问题是 spaCy 在 NER 方面似乎区分大小写 请注意 我不认为这是 spaCy 特有的 当我跑步时 doc nlp u i love nike sho
  • Python函数组成

    我尝试使用良好的语法来实现函数组合 这就是我所得到的 from functools import partial class compfunc partial def lshift self y f lambda args kwargs s
  • 如何在动态执行的代码字符串中使用inspect.getsource?

    如果我在文件中有这段代码 import inspect def sample p1 print p1 return 1 print inspect getsource sample 当我运行脚本时 它按预期工作 在最后一行 源代码sampl
  • 样本()和r样本()有什么区别?

    当我从 PyTorch 中的发行版中采样时 两者sample and rsample似乎给出了类似的结果 import torch seaborn as sns x torch distributions Normal torch tens
  • Django 1.7 应用程序配置导入错误:没有名为 appname.apps 的模块

    我正在尝试按照以下文档为我的一个名为 文章 的 Django 应用程序设置自定义应用程序配置https docs djangoproject com en dev ref applications https docs djangoproj
  • 如何在 Python 中跟踪日志文件?

    我想在 Python 中提供 tail F 或类似内容的输出 而无需阻塞或锁定 我找到了一些非常旧的代码来做到这一点here http code activestate com recipes 436477 filetailpy 但我认为现
  • 更改用作函数全局作用域的字典

    我想做一个 purePython 的装饰器 其中一部分是能够有选择地禁止访问函数的全局范围 有没有一种方法可以以编程方式更改哪个字典事物充当函数的全局 外部作用域 因此 例如在下面我希望能够拦截对f in h并抛出错误 但我想允许访问g因为
  • 异步异常处理程序:在事件循环线程停止之前不会被调用

    我正在我的异步事件循环上设置异常处理程序 但是 在事件循环线程停止之前 它似乎不会被调用 例如 考虑以下代码 def exception handler loop context print Exception handler called
  • 重定向 python 交互式帮助()

    我正在为使用 Qt 的应用程序开发交互式 python shell 但是我似乎无法获得重定向的交互式帮助 我的 python 代码中有这个 class OutputCatcher def init self self data def wr
  • 使用 Sphinx 时,如何记录没有文档字符串的成员?

    我正在为我发布的包编写文档 我发现您的文档越全面 人们就越容易找到您的包来使用 废话 实际上 我在充满爱心地编写代码的所有功能和细节方面获得了很多乐趣 然而 我对如何为类级变量编写与 Sphinx 兼容的文档感到完全困惑 特别是 我有一些e
  • 使用 Numpy 进行多维批量图像卷积

    在图像处理和分类网络中 一个常见的任务是输入图像与一些固定滤波器的卷积或互相关 例如 在卷积神经网络 CNN 中 这是一种极其常见的操作 我已将通用版本任务减少为 Given 一批 N 个图像 N H W D 和一组 K 个滤镜 K H W
  • 为什么我的 PyGame 应用程序根本不运行?

    我有一个简单的 Pygame 程序 usr bin env python import pygame from pygame locals import pygame init win pygame display set mode 400
  • 在 python 中使用高精度时间戳

    嘿 我正在使用 python 处理日期时间 我想知道解析这个时间戳的最佳方法是什么 时间戳是ISO标准 这里是一个例子 2010 06 19T08 17 14 078685237Z 现在到目前为止我已经使用过 time datetime d
  • PYTHON:从 txt 文件中删除 POS 标签

    我有以下 txt 文件 其中包含 POS 词性 http en wikipedia org wiki Part of speech tagging 每个单词的标签 不用 jj到 说 vb 我 ppss是 bedz愤怒 jj在 在 dt无与伦
  • 当训练和测试的特征数量不同时,如何处理生产环境中的One-Hot Encoding?

    在做某些实验时 我们通常在 70 上进行训练 在 33 上进行测试 但是 当您的模型投入生产时会发生什么 可能会发生以下情况 训练集 Ser Type Of Car 1 Hatchback 2 Sedan 3 Coupe 4 SUV 经过
  • 正则表达式 - 匹配不包含字符串的模式

    我对正则表达式很陌生 并且一直在寻找方法来做到这一点 但没有成功 给定一个字符串 我想删除以 abc 开头 以 abc 结尾且中间不包含 abc 的任何模式 如果我做 abc abc abc 它将匹配以 b 开头 以 abc 结尾并且中间包
  • 用 Beautiful Soup 进行抓取:为什么 get_text 方法不返回该元素的文本?

    最近我一直在用 python 开发一个项目 其中涉及抓取一些网站的一些代理 我遇到的问题是 当我尝试抓取某个知名代理站点时 当我要求 Beautiful Soup 查找 IP 在代理表中的位置时 它并没有按照我的预期执行操作 我将尝试查找每

随机推荐

  • 同步时间

    系统时间与硬件时间 一台计算机有两个时钟 一是硬件时间时钟 RTC Real Time Clock 又实时时钟 二是系统时钟 System Clock 1 概念 硬件时钟是嵌在主板上的特殊电路 平时关机后还可计算时间 系统时钟是操作系统的k
  • 安装tensorflow version `CXXABI_1.3.7' not found

    现象 ImportError usr lib64 libstdc so 6 version CXXABI 1 3 7 not found required by root anaconda3 lib python3 6 site ntern
  • mybatis+oracle+map入参,并获取主键ID的返回值

    insert id insert parameterType map useGeneratedKeys true keyProperty id gt insert into person name pswd values name pswd
  • 第五章 Gateway--服务网关

    接上一篇文章开始网关之旅 首先告诉大家网关是什么 Gateway简介 怎么配置 怎么入门 执行流程等等相关介绍 第一章 微服务的架构介绍发展第二章 微服务环境搭建第三章 Nacos Discovery 服务治理第四章 Sentinel 服务
  • 基于深度学习的关系抽取综述

    论文 https arxiv org pdf 1705 03645 pdf 一 介绍 信息抽取是NLP的一个基本任务 从非结构化文本中抽取机器或程序能够理解的结构化知识 信息抽取包括以下子任务 NER 关系抽取 事件抽取等等 本文中 我们着
  • Java list判空

    if null list list size 0 list isEmpty 和list size 0 没有区别 isEmpty 判断有没有元素 而size 返回有几个元素 如果判断一个集合有无元素 建议用isEmpty 方法 这清晰 简明
  • 0基础,自学3个月转行软件测试,从月薪3k到12k我整理的超全学习指南

    大家好我是小娜 现在是一名软件测试测试工程师 工资在1w2阶段还需努力 我大学期间学的是电气工程及其自动化专业 可以说是一事无成哈哈 大学三天打鱼 两天筛网导致专业水平学的不怎么样 毕业后从事了一份销售 买房子 的工作 但是 销售工作压力大
  • GIT代码仓库迁移

    GIT代码仓库迁移 保留原有的提交记录 查看原有提交路径 git remote v 变更为新的提交路径 git remote set url origin 新路径 拉取新路径下的内容 允许不相关历史提交 并强制合并 git pull ori
  • 亲密关系沟通-【正向情绪】创造一场愉快的沟通体验

    为什么有的时候聊天越聊越开心 有时候却让你意兴阑珊 正向情绪体验 积极议题 充分发挥 谁都喜欢被看见 让他不断得到关注 得到你持续的关注 你知道吗 我这个月业绩第一 哇 你超棒的 哪里哪里 话题聊不下去 你给他夸奖 他只能谦虚 天哪你怎么做
  • [转]使用Midjourney命令输出稳定的漫画角色

    转载自 用对Midjourney命令你也可以输出稳定的漫画角色 qq com 昨天的文章已经教会了大家如何成为15分钟快速制作一幅小漫画 有兴趣的可以翻阅上一篇文章 但是不少同学会发现 Midjourney的随机性比较强 即使输入相同的命令
  • 转载:《七周成为数据分析师》

    百日计划第一周总结 1 计划 1 彻底结束之前预定暑假完成的天善学院课程 七周数据分析师 2 总结 七周数据分析师 2 完成情况 1 完成 七周成为数据分析师 任务 2 周总结与 七周数据分析师 一起完成 七周数据分析师 总结 第一周 数据
  • 【Python零基础入门篇 · 17】:模块、模块的使用、过滤执行代码写法、包的使用

    文章目录 模块 内置模块 第三方模块 自定义模块 模块的使用 import 模块名 导入自定义模块 from import 模块起别名 as 导入多模块 模块 模块 就是 py文件 里面定义了一些函数和变量 需要的时候就可以导入这些模块 执
  • 零基础Java详细的jdk的下载以及安装配置

    文章目录 一 下载jdk 二 配置jdk 三 查看配置是否成功 一 下载jdk 1 登录oracle官网 2 3 4 点进去往下拉 会有jdk新版本 接受许可协议 直接下载 zip压缩文档就行 也可以直接下载 exe安装版本 5 找到压缩包
  • FPGA实现VGA显示图片

    利用FPGA在带有VGA接口的液晶显示器上显示图片 电路原理图 端口说明 VGA R2 VGAB0的8个端口位VGA的RGB数据位 VGA HS为行同步信号 VGA VS为场同步信号 以分辨率为640x480为例 刷新速率为60Hz 每幅图
  • [Python学习] 专题六.局部变量、全局变量global、导入模块变量

    定义在函数内的变量有局部作用域 在一个模块中最高级别的变量有全局作用域 本文主要讲述全局变量 局部变量和导入模块变量的方法 参考 Python核心编程 第二版 一 局部变量 声明适用的程序的范围被称为了声明的作用域 在一个过程中 如果名字在
  • 基于芯科Ember SDK开发的ZigBee ota client验证固件时崩溃(Reset info: 0x0A (FLT)), SDK Bug导致!

    现象 ZigBee子设备新固件下载完成后 准备校验其合法性 代码运行至检验部分 MCU崩溃重启 日志如下 RECV ASCII gt Processing message len 33 profile 0104 cluster 0019 T
  • IOS presentViewController没办法全屏的问题

    需要弹出的视图控制器的属性设置为0即可 mImagePick modalPresentationStyle 0
  • sklearn包MLPClassifier的使用详解+例子

    MLPClassifier 参数说明 hidden layer sizes 元组形式 长度n layers 2 默认 100 第i元素表示第i个神经元的个数 activation identity logistic tanh relu 默认
  • Vue3中的pinia使用(收藏版)

    1 pinia介绍 个人网站 紫陌 笔记分享网 想寻找共同学习交流 共同成长的伙伴 请点击 前端学习交流群 pinia 是 Vue 的存储库 它允许您跨组件 页面共享状态 就是和vuex一样的实现数据共享 依据Pinia官方文档 Pinia
  • 【Python】Python 模式匹配与正则表达式

    Python 模式匹配与正则表达式 1 模式匹配与正则表达式 你可能熟悉文本查找 即按下Ctrl F 输入你要查找的词 正则表达式 更进一步 它们让你指定要查找的 模式 你也许不知道一家公司的准确电话号码 但如果你住在美国或加拿大 你就知道