正则表达式

it2023-11-03  84

1.基础 {m} 匹配前一个字符m次 [abc] a或b或c * 匹配前一个字符0到无限次 + 匹配前一个字符1到无限次 ? 匹配前一个字符0到1次 {a,b}匹配前一个字符或子表达式至少m次至多n次 {n,} 匹配前一个字符或者子表达式至少n次 . 代表任意一个字符,包括它本身 ^ 表示取反 多加个?号,会把模式为惰性匹配

简单来说,就是你要匹配的字符是XX,但必须满足形式是AXXB这样的字符串,那么你就可以这样写正则表达式 p = r"(?<=A)XX(?=B)"

2.回溯引用 不同于前面的向前向后查找,这一条有时候你未必绕的过去。在有些情况下,你还必须得用到回溯引用,所以你如果想拥有在实际应用中使用正则表达式,回溯引用是你应该了解和掌握的。

我们还是从最开始的例子来说。 你原本要匹配<h1></h1>之间的内容, 现在你知道HTML有多级标题,你想把每一级的标题内容都提取出来。你也许会这样写:

p = r"<h[1-6]>.*?</h[1-6]>" 这样一来,你就可以将HTML页面内所有的标题内容全部匹配出来。即<h1></h1>到<h6></h6>的内容都可以被提取出来。 但是我们之前说过,写正则表达式困难的不是匹配到想要的内容,而是尽可能的不匹配到不想要的内容。在这个例子中,很有可能你就会被下面这样的用例玩坏。

比方说 <h1>hello world</h3> 发现后面的了吗?我们不管是怎么写出来这样的标题的,但实实在在的是我们的正则表达式同样会把这里面的hello world匹配出来。这时候就是回溯引用的重要作用。下面就是一个示例:

import re

key = r"<h1>hello world</h3>" p1 = r"<h([1-6])>.*?</h\1>" pattern1 = re.compile(p1) m1 = re.search(pattern1,key) print m1.group(0)#这里是会报错的,因为匹配不到,你如果将源字符串改成</h1> 结尾就能看出效果 看到\1了吗?原本那个位置应该是[1-6],但是我们写的是\1, 我们之前说过,转义符\干的活就是把特殊的字符转成一般的字符,把一般的字符转成特殊字符。 普普通通的数字1被转移成什么了呢?在这里1表示第一个子表达式,也就是说,它是动态的,是随着前面第一个子表达式的匹配到的东西而变化的。比方说前面的子表达式内是[1-6],在实际字符串中找到了1,那么后面的\1就是1,如果前面的子表达式在实际字符串中找到了2,那么后面的\1就是2。 类似的,\2,\3,…就代表第二个第三个子表达式。

所以回溯引用是正则表达式内的一个“动态”的正则表达式,让你根据实际的情况变化进行匹配。

最新回复(0)