正则表达式入门教程

正则表达式入门教程
1 元字符
1.1 \b 匹配单词的开始或结束,也就是单词的分界处
1.2 . 匹配除了换行符以外的任意字符
1.3 * 任意字符串
1.4 ? 任意一个字符
1.5 .* 连在一起就意味着任意数量的不包含换行的字符(此时*代表数量)
  1. \bhi\b.*\bLucy\b 的意思就很明显了:先是一个单词hi,然后是任意个任意字符(但不能是换行),最后是Lucy这个单词

 

1.6 \d 匹配一位数字(0,或1,或2,或……)
  1. \d+ 匹配1个或更多连续的数字。这里的+是和*类似的元字符,不同的是*匹配重复任意次(可能是0次),而+则匹配重复1次或更多次。
  2. 0\d\d-\d\d\d\d\d\d\d\d 等价于 0\d{2}-\d{8} 匹配这样的字符串:以0开头,然后是两个数字,然后是一个连字号“-”,最后是8个数字
1.7 \s匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等
1.8 \w匹配字母或数字或下划线或汉字等
  1. \ba\w*\b 匹配以字母a开头的单词——先是某个单词开始处(\b),然后是字母a,然后是任意数量的字母或数字(\w*),最后是单词结束处(\b)。
  2. \b\w{6}\b  匹配刚好6个字符的单词。
1.9 ^ 匹配字符串的开始
  1. 如果要求你填写的QQ号必须为5位到12位数字时,可以使用: ^\d{5,12}$ 
1.10 $ 匹配字符串的结束
2 字符转义
2.1 \ 取消字符的特殊意义
3 重复
3.1 * 重复零次或更多次
3.2 + 重复一次或更多次
3.3 ? 重复零次或一次
3.4 {n} 重复n次
3.5 {n,} 重复n次或更多次
3.6 {n,m} 重复n到m次
4 字符类
4.1 [aeiou] 匹配任何一个英文元音字母
4.2 [.?!] 匹配标点符号(.或?或!)
4.3 [0-9]代表的含意与\d就是完全一致的:一位数字
  1. \(?0\d{2}[) -]?\d{8} 表达式可以匹配几种格式的电话号码,像(010)88886666,或022-22334455,或02912345678等。我们对它进行一些分析吧:首先是一个转义字符\(,它能出现0次或1次(?),然后是一个0,后面跟着2个数字(\d{2}),然后是)或-或空格中的一个,它出现1次或不出现(?),最后是8个数字(\d{8})。也能匹配010)12345678或(022-87654321这样的“不正确”的格式。
5 分枝条件
5.1 |把不同的规则分隔开
  1. 匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。
  2. 0\d{2}-\d{8}|0\d{3}-\d{7} 这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)。
  3. \(?0\d{2}\)?[- ]?\d{8}|0\d{2}[- ]?\d{8} 这个表达式匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔。你可以试试用分枝条件把这个表达式扩展成也支持4位区号的。
  4. \d{5}-\d{4}|\d{5} 这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字,或者用连字号间隔的9位数字。之所以要给出这个例子是因为它能说明一个问题:使用分枝条件时,要注意各个条件的顺序。如果你把它改成 \d{5}|\d{5}-\d{4} 的话,那么就只会匹配5位的邮编(以及9位邮编的前5位)。
6 分组
6.1 () 用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了
  1. (\d{1,3}\.){3}\d{1,3} 是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它: \d{1,3} 匹配1到3位的数字, (\d{1,3}\.){3} 匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字 (\d{1,3}) 。不幸的是,它也将匹配256.300.888.999这种不可能存在的IP地址。如果能使用算术比较的话,或许能简单地解决这个问题,但是正则表达式中并不提供关于数学的任何功能
  2. 正确的IP地址: ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) 
7 反义
7.1 \W 匹配任意不是字母,数字,下划线,汉字的字符
7.2 \S 匹配任意不是空白符的字符
7.3 \D 匹配任意非数字的字符
7.4 \B 匹配不是单词开头或结束的位置
7.5 [^x] 匹配除了x以外的任意字符
  1. <a[^>]+> 匹配用尖括号括起来的以a开头的字符串。
7.6 [^aeiou] 匹配除了aeiou这几个字母以外的任意字符
8 后向引用
  1. 使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。
  2. 后向引用用于重复搜索前面某个分组匹配的文本。例如,\1代表分组1匹配的文本。
8.1 \1 代表分组1匹配的文本
  1. \b(\w+)\b\s+\1\b 可以用来匹配重复的单词,像go go, 或者kitty kitty。这个表达式首先是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字 (\b(\w+)\b) ,这个单词会被捕获到编号为1的分组中,然后是1个或几个空白符 (\s+) ,最后是分组1中捕获的内容(也就是前面匹配的那个单词) (\1) 
8.2 (?<Word>\w+)或(?'Word'\w+) 指定子表达式的组名为Word
  1. 要反向引用这个分组捕获的内容,你可以使用 \k<Word> ,所以上一个例子也可以写成这样: \b(?<Word>\w+)\b\s+\k<Word>\b
8.3 捕获
8.3.1 (exp) 匹配exp,并捕获文本到自动命名的组里
8.3.2 (?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
8.3.3 (?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
9 零宽断言
9.1 (?=exp) 匹配exp前面的位置
  1. (?=exp) 也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如 \b\w+(?=ing\b) ,匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。
9.2 (?<=exp) 匹配exp后面的位置
  1. (?<=exp) 也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。比如 (?<=\bre)\w+\b 会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。
  2. (?<=\s)\d+(?=\s) 匹配以空白符间隔的数字(再次强调,不包括这些空白符)。
9.3 (?!exp) 匹配后面跟的不是exp的位置
  1. \b\w*q[^u]\w*\b 匹配包含后面不是字母u的字母q的单词。但是如果多做测试(或者你思维足够敏锐,直接就观察出来了),你会发现,如果q出现在单词的结尾的话,像Iraq,Benq,这个表达式就会出错。这是因为[^u]总要匹配一个字符,所以如果q是单词的最后一个字符的话,后面的[^u]将会匹配q后面的单词分隔符(可能是空格,或者是句号或其它的什么),后面的\w*\b将会匹配下一个单词,于是 \b\w*q[^u]\w*\b 就能匹配整个Iraq fighting。负向零宽断言能解决这样的问题,因为它只匹配一个位置,并不消费任何字符。现在,我们可以这样来解决这个问题:\b\w*q(?!u)\w*\b 
  2. \d{3}(?!\d) 匹配三位数字,而且这三位数字的后面不能是数字; \b((?!abc)\w)+\b 匹配不包含连续字符串abc的单词。

 

9.4 (?<!exp) 匹配前面不是exp的位置
  1. (?<![a-z])\d{7} 匹配前面不是小写字母的七位数字。
  2. (?<=<(\w+)>).*(?=<\/\1>) 匹配不包含属性的简单HTML标签内里的内容。 (?<=<(\w+)>) 指定了这样的前缀:被尖括号括起来的单词(比如可能是<b>),然后是.*(任意的字符串),最后是一个后缀 (?=<\/\1>) 。注意后缀里的\/,它用到了前面提过的字符转义;\1则是一个反向引用,引用的正是捕获的第一组,前面的(\w+)匹配的内容,这样如果前缀实际上是<b>的话,后缀就是</b>了。整个表达式匹配的是<b>和</b>之间的内容(再次提醒,不包括前缀和后缀本身)。
10 注释
10.1 (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

小括号的另一种用途是通过语法(?#comment)来包含注释。例如: 2[0-4]\d(?#200-249)|25[0- 5](?#250-255)|[01]?\d\ d?(?#0-199) 

要包含注释的话,最好是启用“忽略模式里的空白符”选项,这样在编写表达式时能任意的添加空格,Tab,换行,而实际使用时这些都将被忽略。启用这个选项后,在#后面到这一行结束的所有文本都将被当成注释忽略掉。例如,我们可以前面的一个表达式写成这样:

       (?<=    # 断言要匹配的文本的前缀

      <(\w+)> # 查找尖括号括起来的字母或数字(即HTML/XML标签)

      )       # 前缀结束

      .*      # 匹配任意文本

      (?=     # 断言要匹配的文本的后缀

      <\/\1>  # 查找尖括号括起来的内容:前面是一个"/",后面是先前捕获的标签

      )       # 后缀结束

11 贪婪与懒惰
  1. 当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
  2. 有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。
11.1 *? 重复任意次,但尽可能少重复
11.2 +? 重复1次或更多次,但尽可能少重复
11.3 ?? 重复0次或1次,但尽可能少重复
11.4 {n,m}? 重复n到m次,但尽可能少重复
11.5 {n,}? 重复n次以上,但尽可能少重复
12 平衡组/递归匹配

1.把xx <aa <bbb> <bbb> aa> yy这样的字符串里,最长的配对的尖括号内的内容捕获出来。我们需要做的是每碰到了左括号,就在压入一个"Open",每碰到一个右括号,就弹出一个,到了最后就看看堆栈是否为空--如果不为空那就证明左括号比右括号多,那匹配就应该失败。正则表达式引擎会进行回溯(放弃最前面或最后面的一些字符),尽量使整个表达式得到匹配。

<                         #最外层的左括号

    [^<>]*                #最外层的左括号后面的不是括号的内容

    (

        (

            (?'Open'<)    #碰到了左括号,在黑板上写一个"Open"

            [^<>]*       #匹配左括号后面的不是括号的内容

        )+

        (

            (?'-Open'>)   #碰到了右括号,擦掉一个"Open"

            [^<>]*        #匹配右括号后面不是括号的内容

        )+

    )*

    (?(Open)(?!))         #在遇到最外层的右括号前面,判断黑板上还有没有没擦掉的"Open";如果还有,则匹配失败



>                         #最外层的右括号

2.平衡组的一个最常见的应用就是匹配HTML,下面这个例子可以匹配嵌套的<div>标签: <div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div> .

12.1 (?'group') 把捕获的内容命名为group,并压入堆栈(Stack)
12.2 (?'-group') 从堆栈上弹出最后压入堆栈的名为group的捕获内容,如果堆栈本来为空,则本分组的匹配失败
12.3 (?(group)yes|no) 如果堆栈上存在以名为group的捕获内容的话,继续匹配yes部分的表达式,否则继续匹配no部分
12.4 (?!) 零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败
13 其他
13.1 \a 报警字符(打印它的效果是电脑嘀一声)
13.2 \b 通常是单词分界位置,但如果在字符类里使用代表退格
13.3 \t 制表符,Tab
13.4 \r 回车
13.5 \v 竖向制表符
13.6 \f 换页符
13.7 \n 换行符
13.8 \e Escape
13.9 \0nn ASCII代码中八进制代码为nn的字符
13.10 \xnn ASCII代码中十六进制代码为nn的字符
13.11 \unnnn Unicode代码中十六进制代码为nnnn的字符
13.12 \cN ASCII控制字符。比如\cC代表Ctrl+C
13.13 \A 字符串开头(类似^,但不受处理多行选项的影响)
13.14 \Z 字符串结尾或行尾(不受处理多行选项的影响)
13.15 \z 字符串结尾(类似$,但不受处理多行选项的影响)
13.16 \G 当前搜索的开头
13.17 \p{name} Unicode中命名为name的字符类,例如\p{IsGreek}
13.18 (?>exp) 贪婪子表达式
13.19 (?<x>-<y>exp) 平衡组
13.20 (?im-nsx:exp) 在子表达式exp中改变处理选项
13.21 (?im-nsx) 为表达式后面的部分改变处理选项
13.22 (?(exp)yes|no) 把exp当作零宽正向先行断言,如果在这个位置能匹配,使用yes作为此组的表达式;否则使用no
13.23 (?(exp)yes) 同上,只是使用空表达式作为no
13.24 (?(name)yes|no) 如果命名为name的组捕获到了内容,使用yes作为表达式;否则使用no
13.25 (?(name)yes) 同上,只是使用空表达式作为no

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值