文章目录

  • 1.re模块的search方法
  • 2.Python3正则表达式特殊符号及用法
  • 3.编译正则表达式
  • 4.编译标志
  • 5.re.seach()
  • 6.re.findall()

1.re模块的search方法

  • search()方法用于在字符串中搜索正则表达式模式第一次出现的位置,如果找到了,匹配的位置是(7,12)。
    这里需要注意两点:
    1️⃣第一个参数是正则表达式模式,也就是你要描述的搜索规则,需要使用原始字符串来写,这样可以避免很多不必要的麻烦。
    2️⃣找到后返回的范围是以下标0开始的,这跟字符串一样。如果找不到,返回None。
>>> import re
>>> re.search(r'FishC', 'I love FishC.com!')
<re.Match object; span=(7, 12), match='FishC'>
  • 通配符
    点号(.)来表示可以匹配除了换行符之外的任何字符
>>> re.search(r'.', 'I love FishC.com!')
<re.Match object; span=(0, 1), match='I'>
>>> re.search(r'Fish.', 'I love FishC.com!')
<re.Match object; span=(7, 12), match='FishC'>
  • 反斜杠
    反斜杠剥夺元字符(.)的特殊能力。
>>> re.search(r'\.', 'I love FishC.com!')
<re.Match object; span=(12, 13), match='.'>
  • \d
    匹配任意一个数字0-9
>>> re.search(r'\d', 'I love 123 FishC.com!')
<re.Match object; span=(7, 8), match='1'>
  • 字符类
    使用中括号将任何内容包起来就是一个字符类,它的含义是你只要匹配这个字符类中的任何字符,结果就算作匹配。
    注意:默认区分大小写。
>>> re.search(r'[aeiou]', 'I love 123 FishC.com!')
<re.Match object; span=(3, 4), match='o'>>>> re.search(r'[aeiouAEIOU]', 'I love 123 FishC.com!')
<re.Match object; span=(0, 1), match='I'>
>>> re.search(r'[a-z]', 'I love 123 FishC.com!')
<re.Match object; span=(2, 3), match='l'>
>>> re.search(r'[0-2][0-5][0-5]', 'I love 123 FishC.com!')
<re.Match object; span=(7, 10), match='123'>
  • 重复匹配
    用大括号这个元字符来实现重复匹配的功能。
>>> re.search(r'ab{3}c', 'abbbc')
<re.Match object; span=(0, 5), match='abbbc'>超过3个或者少于3个都不能匹配。>>> re.search(r'ab{3}c', 'abbbbbc')
>>> 重复的次数也可以取一个范围。
>>> re.search(r'ab{3,5}c', 'abbbc')
<re.Match object; span=(0, 5), match='abbbc'>
>>> re.search(r'ab{3,5}c', 'abbbbc')
<re.Match object; span=(0, 6), match='abbbbc'>
>>> re.search(r'ab{3,5}c', 'abbbbbc')
<re.Match object; span=(0, 7), match='abbbbbc'>
  • 请问如何用正则表达式匹配0~255这个范围的数??
1.百位可能是0或1,当百位是0或1时,个位和十位任意;
2.当百位是2时,十位是0-4,个位任意;
3.当百位是2,十位是5时,个位是0-5;
>>> re.search(r'[0-1]\d\d|2[0-4]\d|25[0-5]', '188')
<_sre.SRE_Match object; span=(0, 3), match='188'>
  • 匹配ip地址
其中{3}表示重复3次;其中小括号表示分组的意思,一个小组就是一个整体。{0,1}表示重复0次(没有)或者1次。
>>> re.search(r'(([0-1]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])\.){3}([0-1]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])','192.168.1.1')
<_sre.SRE_Match object; span=(0, 11), match='192.168.1.1'>

2.Python3正则表达式特殊符号及用法

符号 含义
. 表示匹配除了换行符外的任何字符。注:通过设置 re.DOTALL 标志可以使 . 匹配任何字符(包含换行符)
A
^ (脱字符)匹配输入字符串的开始位置。如果设置了 re.MULTILINE 标志,^ 也匹配换行符之后的位置
$ 匹配输入字符串的结束位置。如果设置了 re.MULTILINE 标志,$ 也匹配换行符之前的位置
| 将一个普通字符变成特殊字符,例如 \d 表示匹配所有十进制数字。 解除元字符的特殊功能,例如 . 表示匹配点号本身。引用序号对应的子组所匹配的字符串
[…] 字符类,匹配所包含的任意一个字符。注:连字符 - 如果出现在字符串中间表示字符范围描述;如果出现在首位则仅作为普通字符。特殊字符仅有反斜线 \ 保持特殊含义,用于转义字符。其它特殊字符如 *、+、? 等均作为普通字符匹配。脱字符 ^ 如果出现在首位则表示匹配不包含其中的任意字符;如果 ^ 出现在字符串中间就仅作为普通字符匹配
{M,N} M 和 N 均为非负整数,其中 M <= N,表示前边的 RE 匹配 M ~ N 次。注:{M,} 表示至少匹配 M 次;{,N} 等价于 {0,N};{N} 表示需要匹配 N 次
* 匹配前面的子表达式零次或多次,等价于 {0,}
+ 匹配前面的子表达式一次或多次,等价于 {1,}
? 匹配前面的子表达式零次或一次,等价于 {0,1}
*?, +?, ?? 默认情况下 、+ 和 ? 的匹配模式是贪婪模式(即会尽可能多地匹配符合规则的字符串);?、+? 和 ?? 表示启用对应的非贪婪模式。举个例子:对于字符串 “FishCCC”,正则表达式 FishC+ 会匹配整个字符串,而 FishC+? 则匹配 “FishC”
{M,N}? 同上,启用非贪婪模式,即只匹配 M 次
(…) 匹配圆括号中的正则表达式,或者指定一个子组的开始和结束位置。注:子组的内容可以在匹配之后被 \数字 再次引用 。举个例子:(\w+) \1 可以字符串 “FishC FishC.com” 中的 “FishC FishC”(注意有空格)
(?..) (? 开头的表示为正则表达式的扩展语法(下边这些是 Python 支持的所有扩展语法)
(?aiLmsux) 1. (? 后可以紧跟着 ‘a’,‘i’,‘L’,‘m’,‘s’,‘u’,‘x’ 中的一个或多个字符,只能在正则表达式的开头使用。2. 每一个字符对应一种匹配标志:re-A(只匹配 ASCII 字符),re-I(忽略大小写),re-L(区域设置),re-M(多行模式), re-S(. 匹配任何符号),re-X(详细表达式),包含这些字符将会影响整个正则表达式的规则。3. 当你不想通过 re.compile() 设置正则表达式标志,这种方法就非常有用啦。注意,由于 (?x) 决定正则表达式如何被解析,所以它应该总是被放在最前边(最多允许前边有空白符)。如果 (?x) 的前边是非空白字符,那么 (?x) 就发挥不了作用了
(?:…) 非捕获组,即该子组匹配的字符串无法从后边获取
(?P…) 命名组,通过组的名字(name)即可访问到子组匹配的字符串
(?P=name) 反向引用一个命名组,它匹配指定命名组匹配的任何内容
(?#…) 注释,括号中的内容将被忽略
(?=…) 前向肯定断言。如果当前包含的正则表达式(这里以 … 表示)在当前位置成功匹配,则代表成功,否则失败。一旦该部分正则表达式被匹配引擎尝试过,就不会继续进行匹配了;剩下的模式在此断言开始的地方继续尝试。举个例子:love(?=FishC) 只匹配后边紧跟着 “FishC” 的字符串 “love”
(?!..) 前向否定断言。这跟前向肯定断言相反(不匹配则表示成功,匹配表示失败)。举个例子:FishC(?!.com) 只匹配后边不是 “.com” 的字符串 “FishC”
(?<=…) 后向肯定断言。跟前向肯定断言一样,只是方向相反。举个例子:(?<=love)FishC 只匹配前边紧跟着 “love” 的字符串 “FishC”
(?<!..) 后向否定断言。跟前向肯定断言一样,只是方向相反。举个例子:(?<!FishC).com 只匹配前边不是 “FishC” 的字符串 “.com”
(?(id/name)yes-pattern|no-pattern) 1. 如果子组的序号或名字存在的话,则尝试 yes-pattern 匹配模式;否则尝试 no-pattern 匹配模式。2. no-pattern 是可选的。举个例子:(<)?(\w+@\w+(?:.\w+)+)(?(1)>
| 下边列举了由字符 ‘’ 和另一个字符组成的特殊含义。注意,’’ + 元字符的组合可以解除元字符的特殊功能
\序号 1. 引用序号对应的子组所匹配的字符串,子组的序号从 1 开始计算。2. 如果序号是以 0 开头,或者 3 个数字的长度。那么不会被用于引用对应的子组,而是用于匹配八进制数字所表示的 ASCII 码值对应的字符。举个例子:(.+) \1 会匹配 “FishC FishC” 或 “55 55”,但不会匹配 “FishCFishC”(注意,因为子组后边还有一个空格)
\A 匹配输入字符串的开始位置
\Z 匹配输入字符串的结束位置
\b 匹配一个单词边界,单词被定义为 Unidcode 的字母数字或下横线字符。举个例子:\bFishC\b 会匹配字符串 “love FishC”、FishC." 或 “(FishC)”
\B 匹配非单词边界,其实就是与 \b 相反。举个例子:py\B 会匹配字符串 “python”、“py3” 或 “py2”,但不会匹配 "py "、“py.” 或 “py!”
\d 1. 对于 Unicode(str 类型)模式:匹配任何一个数字,包括 [0-9] 和其他数字字符;如果开启了 re.ASCII 标志,就只匹配 [0-9]。2. 对于 8 位(bytes 类型)模式:匹配 [0-9] 中任何一个数字
\D 匹配任何非 Unicode 的数字,其实就是与 \d 相反;如果开启了 re.ASCII 标志,则相当于匹配 [^0-9]
\s 1. 对于 Unicode(str 类型)模式:匹配 Unicode 中的空白字符(包括 [ \t\n\r\f\v] 以及其他空白字符);如果开启了 re.ASCII 标志,就只匹配 [ \t\n\r\f\v]。2. 对于 8 位(bytes 类型)模式:匹配 ASCII 中定义的空白字符,即 [ \t\n\r\f\v]
\S 匹配任何非 Unicode 中的空白字符,其实就是与 \s 相反;如果开启了 re.ASCII 标志,则相当于匹配 [^ \t\n\r\f\v]
\w 1. 对于 Unicode(str 类型)模式:匹配任何 Unicode 的单词字符,基本上所有语言的字符都可以匹配,当然也包括数字和下横线;如果开启了 re.ASCII 标志,就只匹配 [a-zA-Z0-9_]。2. 对于 8 位(bytes 类型)模式:匹配 ASCII 中定义的字母数字,即 [a-zA-Z0-9_]
\W 匹配任何非 Unicode 的单词字符,其实就是与 \w 相反;如果开启了 re.ASCII 标志,则相当于 [^a-zA-Z0-9_]
转义符号 正则表达式还支持大部分 Python 字符串的转义符号:\a,\b,\f,\n,\r,\t,\u,\U,\v,\x,\。注:\b 通常用于匹配一个单词边界,只有在字符类中才表示“退格”;\u 和 \U 只有在 Unicode 模式下才会被识别;八进制转义(\数字)是有限制的,如果第一个数字是 0,或者如果有 3 个八进制数字,那么就被认为是八进制数;其他情况则被认为是子组引用;至于字符串,八进制转义总是最多只能是 3 个数字的长度
  • eg:
>>> import re
>>> re.search(r"Fish(C|D)", "FishC")
<re.Match object; span=(0, 5), match='FishC'>
>>> re.search(r"^FishC", "FishC.com")
<re.Match object; span=(0, 5), match='FishC'>
>>> re.search(r"FishC$","loveFishC")
<re.Match object; span=(4, 9), match='FishC'>>>> re.search(r"(FishC)\1", "FishCFishC")
<_sre.SRE_Match object; span=(0, 10), match='FishCFishC'>ASCII码字符a的八进制数是\141,a=97,十进制=141,八进制(八进制需要三个数来表示)
>>> re.search(r"(FishC)\060", "FishCFishC0")
<_sre.SRE_Match object; span=(5, 11), match='FishC0'>>>> re.search(r"(FishC)\141", "FishCFishCa")
<_sre.SRE_Match object; span=(5, 11), match='FishCa'>>>> re.findall(r"[a-z]", "FishCFishCa")
['i', 's', 'h', 'i', 's', 'h', 'a']>>> re.findall(r"[\n]", "FishCFishCa\n")
['\n']>>> re.findall(r"[^a-z]", "FishCFishCa")
['F', 'C', 'F', 'C']>>> re.search(r"FishC{3}", "FishCCCCCC")
<_sre.SRE_Match object; span=(0, 7), match='FishCCC'>>>> re.search(r"FishC{1,3}", "FishCFishC")
<_sre.SRE_Match object; span=(0, 5), match='FishC'>贪婪(尽可能多的匹配)与非贪婪(加上一个?)
>>> re.search(r"<.+>", ",<html><title>wangji<title></html>")
<_sre.SRE_Match object; span=(1, 34), match='<html><title>wangji<title></html>'>
>>> re.search(r"<.+>?", ",<html><title>wangji<title></html>")>
>>> re.search(r"<.+?>", ",<html><title>wangji<title></html>")
<_sre.SRE_Match object; span=(1, 7), match='<html>'>
  • eg:
下划线不是单词边界,所以没有匹配出来
>>> re.findall(r"\bFishC\b","FishC.Fish_(FishC)")
['FishC', 'FishC']>>> re.findall(r"\w","wangji_ _")
['w', 'a', 'n', 'g', 'j', 'i', '_', '_']

3.编译正则表达式

  • 如果你需要重复地使用某个正则表达式,那么你可以先将该正则表达式编译成模式对象,使用re.compile()来编译

  • eg:

>>> p=re.compile(r"[a-z]")
>>> p.search("wangji")
<_sre.SRE_Match object; span=(0, 1), match='w'>
>>> p.findall("wangji")
['w', 'a', 'n', 'g', 'j', 'i']

4.编译标志

  • 编译标志让你可以修改正则表达式的工作方式。在 re 模块下,编译标志均有两个名字:完整名和简写,例如 IGNORECASE 简写是 I(如果你是 Perl 的粉丝,那么你有福了,因为这些简写跟 Perl 是一样的,例如 re.VERBOSE 的简写是 re.X)。另外,多个标志还可以同时使用(通过“|”),如:re.I | re.M 就是同时设置 I 和 M 标志。

  • 下边列举一些支持的编译标志:

标志 含义
ASCII, A 使得转义符号如 \w,\b,\s 和 \d 只能匹配 ASCII 字符
DOTALL, S 使得 . 匹配任何符号,包括换行符
IGNORECASE, I 匹配的时候不区分大小写
LOCALE, L 支持当前的语言(区域)设置
MULTILINE, M 多行匹配,影响 ^ 和 $
VERBOSE, X (for ‘extended’) 启用详细的正则表达式
  • A
    ASCII
    使得 \w,\W,\b,\B,\s 和 \S 只匹配 ASCII 字符,而不匹配完整的 Unicode 字符。这个标志仅对 Unicode 模式有意义,并忽略字节模式。

  • S
    DOTALL
    使得 . 可以匹配任何字符,包括换行符。如果不使用这个标志,. 将匹配除了换行符的所有字符。

  • I
    IGNORECASE
    字符类和文本字符串在匹配的时候不区分大小写。举个例子,正则表达式 [A-Z] 也将会匹配对应的小写字母,像 FishC 可以匹配 FishC,fishc 或 FISHC 等。如果你不设置 LOCALE,则不会考虑语言(区域)设置这方面的大小写问题。

  • L
    LOCALE
    使得 \w,\W,\b 和 \B 依赖当前的语言(区域)环境,而不是 Unicode 数据库。
    区域设置是 C 语言的一个功能,主要作用是消除不同语言之间的差异。例如你正在处理的是法文文本,你想使用 \w+ 来匹配单词,但是 \w 只是匹配 [A-Za-z] 中的单词,并不会匹配 ‘é’ 或 ‘ç’。如果你的系统正确的设置了法语区域环境,那么 C 语言的函数就会告诉程序 ‘é’ 或 ‘ç’ 也应该被认为是一个字符。当编译正则表达式的时候设置了 LOCALE 的标志,\w+ 就可以识别法文了,但速度多少会受到影响。

  • M
    MULTILINE
    (^ 和 $ 我们还没有提到,别着急,后边我们有细讲…)
    通常 ^ 只匹配字符串的开头,而 $ 则匹配字符串的结尾。当这个标志被设置的时候,^ 不仅匹配字符串的开头,还匹配每一行的行首;& 不仅匹配字符串的结尾,还匹配每一行的行尾。

  • X
    VERBOSE
    这个标志使你的正则表达式可以写得更好看和更有条理,因为使用了这个标志,空格会被忽略(除了出现在字符类中和使用反斜杠转义的空格);这个标志同时允许你在正则表达式字符串中使用注释,# 符号后边的内容是注释,不会递交给匹配引擎(除了出现在字符类中和使用反斜杠转义的 #)。

  • 下边是使用 re.VERBOSE 的例子,大家看下正则表达式的可读性是不是提高了不少:

charref = re.compile(r"""
&[#]                # 开始数字引用
(0[0-7]+         # 八进制格式| [0-9]+          # 十进制格式| x[0-9a-fA-F]+   # 十六进制格式
)
;                   # 结尾分号
""", re.VERBOSE)如果没有设置 VERBOSE 标志,那么同样的正则表达式会写成:
charref = re.compile("&#(0[0-7]+|[0-9]+|x[0-9a-fA-F]+);")

5.re.seach()

  • search() 方法并不会立刻返回你所需要的字符串,取而代之,它是返回一个匹配对象
  • group()方法
    匹配对象有一些方法,你使用这些方法才能够获得你所需要的匹配的字符串;
    如果正则表达式中存在着 子组,子组会将匹配的内容进行捕获,通过这个 group()方法中设置序号,可以提取到对应的子组 捕获的字符串;
    start()方法 :返回它匹配的开始位置;
    end()方法 :返回它匹配的结束位置;
    span()方法 :返回它匹配的范围;
>>> result=re.search(r" (\w+) (\w+)", "I love wangji")
>>> result
<_sre.SRE_Match object; span=(1, 13), match=' love wangji'>
>>> result.group()
' love wangji'
>>> result.group(0)
' love wangji'
>>> result.group(1)
'love'
>>> result.group(2)
'wangji'
>>> result.start()
1
>>> result.end()
13
>>> result.span()
(1, 13)
>>>

6.re.findall()

  • findall() 方法:找到所有匹配的内容,然后把它们组织成列表的形式返回
import urllib.request
import redef open_url(url):req = urllib.request.Request(url)req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400')response = urllib.request.urlopen(req)html = response.read().decode("utf-8")  return htmldef get_img(html):#爬取图片的正则表达式p = r'<img class="BDE_Image" src="[^"]+\.jpg"'imglist = re.findall(p,html)for each in imglist:print(each)if __name__ == '__main__':url = "http://tieba.baidu.com/p/5252578245"get_img(open_url(url))

  • 接下来要解决的问题就是如何把里边这些地址给提取出来,因为你直接复制上面一个地址去浏览器打开是下载不了,我们需要的是那个地址才可以访问到图片,改的方法也很简单,如下
p = r'<img class="BDE_Image" src="[^"]+\.jpg"' 改为 p = r'<img class="BDE_Image" src="([^"]+\.jpg)"',
import urllib.request
import redef open_url(url):req = urllib.request.Request(url)req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400')response = urllib.request.urlopen(req)html = response.read().decode("utf-8")return htmldef get_img(html):#爬取图片的正则表达式p = r'<img class="BDE_Image" src="([^"]+\.jpg)"'imglist = re.findall(p,html)'''for each in imglist:print(each)'''for each in imglist:filename = each.split("/")[-1] #因为图片的路径都是/隔开的,取最后一个就是文件名#用urlretrieve()这个方法来获得他的内容,自动下载他的地址urllib.request.urlretrieve(each,filename,None)if __name__ == '__main__':url = "http://tieba.baidu.com/p/5252578245"get_img(open_url(url))

  • 那为什么加个小括号会如此方便呢?这是因为在 findall() 方法中,如果给出的正则表达式是包含着子组的话,那么就会把子组的内容单独给返回回来。然而,如果存在多个子组,那么它还会将匹配的内容组合成元组的形式再返回。

  • 自动获取ip地址的例子,获取多个子组

import urllib.request
import redef open_url(url):req = urllib.request.Request(url)req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400')response = urllib.request.urlopen(req)html = response.read().decode("utf-8")return htmldef get_img(html):#IP地址的正则表达式p = r'(([0,1]?\d?\d|2[0-4]\d|25[0-5])\.){3}([0,1]?\d?\d|2[0-4]\d|25[0-5])'iplist = re.findall(p,html)for each in iplist:print(each)if __name__ == '__main__':url = "https://www.xicidaili.com/wt/"get_img(open_url(url))

  • 可以看到让我们很迷茫,为什么会这样呢?这明显不是我们想要的结果,这是因为我们在正则表达式里面使用了 3 个子组,所以,findall() 会自作聪明的帮我们的结果做了分类,然后用元组的形式返回给我们。
  • 要解决这个问题,我们可以让子组不捕获内容。可以使用拓展语法,那么让子组不捕获内容那也就是非捕获组,扩展语法就是(?:…),如果小括号后面仅跟一个?那么表示为正则表达式的拓展语法,因为问号?是匹配他紧挨他前面的东西一次或者没有,左边是小括号,那么你加个?问号没有意义,因为小括号是元字符。
import urllib.request
import redef open_url(url):req = urllib.request.Request(url)req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400')response = urllib.request.urlopen(req)html = response.read().decode("utf-8")return htmldef get_img(html):#IP地址的正则表达式p = r'(?:(?:[0,1]?\d?\d|2[0-4]\d|25[0-5])\.){3}(?:[0,1]?\d?\d|2[0-4]\d|25[0-5])'iplist = re.findall(p,html)for each in iplist:print(each)if __name__ == '__main__':url = "https://www.xicidaili.com/wt/"get_img(open_url(url))

  • 参考:第五十七课:论一只爬虫的自我修养:正则表达式,第五十八课:论一只爬虫的自我修养:特殊符号及用法,正则表达式re之模块函数和编译标志

(P57-P61)正则表达式相关推荐

  1. 通过正则表达式校验手机号码,拿走即用!

    校验手机号码 2021/01/06更新,电信新增了191号段 1. 单纯校验长度 2.正则表达式校验数字 3.正则表达式校验是否是大陆号码 4.正则表达式校验是否是香港号码 //校验长度private ...

  2. Linux shell 学习笔记(15)— shell 正则表达式

    1. 定义 BRE 模式 1.1 纯文本 第一条原则就是:正则表达式模式都区分大小写.这意味着它们只会匹配大小写也相符的模式. $ echo "This is a test" | ...

  3. re2正则表达式匹配引擎的c接口版本cre2的中文使用手册

    前言 re2 官方地址: https://github.com/google/re2 cre2 官方地址: https://github.com/marcomaggi/cre2 1 基本类型定义 不透 ...

  4. 正则表达式(括号)、[中括号]、{大括号}的区别小结

    正则表达式(括号).[中括号].{大括号}的区别小结 </h1><div class="clear"></div><div class=& ...

  5. Python中正则表达式用法 重点格式以这个为准_首看_各种问题

    20210811 https://www.jb51.net/article/101258.htm 一.惰性模式的概念: 此模式和贪婪模式恰好相反,它尽可能少的匹配字符以满足正则表达式即可,例如: va ...

  6. 正则语法完全正则表达式手册_语法格式重点

    20211202 https://blog.csdn.net/lc11535/article/details/103266263 该表达式打开re.U(re.UNICODE)标志. python –& ...

  7. 正则表达式 - 语法

    正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串.将匹配的子串替换或者从某个串中取出符合某个条件的子串等. 例如: r ...

  8. 正则表达式中的\.表示什么意思

    \ 这是引用符,用来将这里列出的这些元字符当作普通的字符来进行匹配.例如正则表达式\$被用来匹配美元符号,而不是行尾,类似的,正则表达式\.用来匹配点字符,而不是任何字符的通配符.

  9. ?:在正则表达式中什么意思

    "?:"非获取匹配,匹配冒号后的内容但不获取匹配结果,不进行存储供以后使用. 单独的"?":匹配前面的子表达式零次或一次. 当"?"紧跟在任 ...

  10. 关于正则表达式 \1 \2之类的问题

    我们创建一个正则表达式 var RegExp = /^(123)(456)\2\1$/; 这个正则表达式匹配到的字符串就是 123456456123 创建另外第二正则表达式 var RegExp1 = ...

最新文章

  1. 普通页面使用vue.js心得
  2. CENTOS/RHEL 7 系统中设置SYSTEMD SERVICE的ULIMIT资源限制
  3. C项目实践--俄罗斯方块(2)
  4. 一篇讲清:数据采集与埋点
  5. nowcoder 202F-平衡二叉树
  6. getsockopt和setsockopt函数
  7. javascript 小结
  8. Java之volatile
  9. OpenGL ES之3D模型加载和渲染
  10. Python - 多个Excel合并 (列不同序 或 列数不同)
  11. 工具推荐:最好用的pCap工具
  12. 高清HDMI高清编码器(HDMI网络传输器)使用及前景
  13. 强化学习RL学习笔记2-概述(2)
  14. omnigraffle mac 破解
  15. matlab-行相加、列相加
  16. Python全栈(八)Flask项目实战之8.CMS后台轮播图管理
  17. linux 挂载新硬盘
  18. 计算机专业教师资格证考什么科目,教师资格证考试科目
  19. 如何辨别真假IPHONE4 , IPHONE 4S ?
  20. 2020-10-8 用户注册界面简单代码

热门文章

  1. 安卓系统加速_真就这么简单让你的安卓手机变流畅?
  2. [Java学习] 小型社交平台,能发帖、查看、评论、删除帖子等功能
  3. ![CDATA[的web使用简单说明
  4. 阿里云 vs Azure-大数据
  5. Android加固与脱壳分析
  6. 灌注和宝石性道法价比分析
  7. matlab 绘制圆光栅,火爆抖音的圆点光栅画怎么做的?
  8. linux pipe2函数,pipe()函数 Unix/Linux
  9. 中文大写日期转换函数
  10. linux sar 分析,Linux性能测试分析命令_sar