python正则表达式

python正则表达式

基础知识

模式(pattern),模式是正则表达式最重要的概念之一,模式可以理解为模版,设计好了模板之后可以利用此模板与未知字符串进行匹配,得到自己想要的结果。比如设计一个电话号码的模式(pattern),就可以匹配一大串文字中的电话号码。

元字符

元字符通俗地理解就是:并不代表本身字符的含义,而是被赋予了特殊含义的字符。

例如.,在模式里面被用来匹配任意一个字符,与其本身的’点’的含义相去甚远。

又比如?,在模式里面表示前面字符(组)出现的次数为0或1次。

换言之,被占用的无法表征本身含义的字符称之为元字符。元字符包含以下内容:

. ^ $ * + ? { } [ ] \ | ( )
元字符含义
字符 含义 举例
. 任意字符
^ 匹配开头
$ 匹配结尾
* 匹配0次或多次
+ 匹配1次或多次
? 匹配0次或1次
{} 指定匹配重复次数 {m,n}至少重复 m 次,至多重复 n 次。mn 不是必填的,缺失的情况下会设定为默认值。缺失 m 会解释为最少重复 0 次 ,缺失 n 则解释为最多重复无限次。
[] 匹配括号中的任意一个字符 [abc]表示a或b或c中的任意一个。匹配正负号:[+-]?
可以使用-连接多个字符,以简化书写,[a-z][a-zA-Z]
\ 转义
() 类似于改变优先级

元字符^和$在正则表达式中具有特殊的含义,它们可以用来匹配输入字符串的开头和结尾。

^:匹配输入字符串的开头。

例子1:^abc匹配任何以"abc"开头的字符串,例如"abcdef"、"abc123"等。

例子2:^a.b匹配任何以"a"后跟任何字符(除了换行符)再后跟"b"开头的字符串,例如"appleb"和"abab",但不匹配"ab"或"banana"。

$:匹配输入字符串的结尾。

例子1:def$匹配任何以"def"结尾的字符串,例如"abcdef"、"123def"等。

例子2:a.b$匹配任何以"a"后跟任何字符(除了换行符)再后跟"b"结尾的字符串,例如"appleb"和"abab",但不匹配"ab"或"banana"。

注意:在多行模式中,^和$的行为与它们在单行模式中的行为不同。

在多行模式中,^和$分别匹配每行的开头和结尾,而不是整个字符串的开头和结尾。

要启用多行模式,请使用re.MULTILINE标志。

如何解除元字符的特殊含义?

答案是使用反斜杠\

  • 匹配?,需要将模式写为\?
  • 匹配.,需要将模式写为\.
  • 匹配\,需要将模式写为\\

存在的问题,多个反斜杠给阅读带来了巨大的障碍,如果需要需要匹配的结果存在的多个斜杠,那么就需要双倍的斜杠用于取消其元字符含义。

例如需要匹配\\,模式写为\\\\

解决方案,使用原始字符前缀r

使用 Python 的原始字符串表示法来表示正则表达式;反斜杠不以任何特殊的方式处理前缀为 'r' 的字符串字面,因此 r"\n" 是一个包含 '\''n' 的双字符字符串,而 "\n" 是一个包含换行符的单字符字符串。 正则表达式通常使用这种原始字符串表示法用 Python 代码编写。

使用原始字符前缀r简化后的模式:

  • 匹配?,需要将模式写为r\?
  • 匹配.,需要将模式写为r\.
  • 匹配\,需要将模式写为r\
一些固定搭配
符号 说明 示例
\d 匹配数字,等价于[0-9]
\w 匹配任何字母数字下划线字符,等价于[a-zA-Z0-9_]
\s 匹配任何空白字符,等价于[ \t\n\r\f\v]

使用re模块的匹配方法

方法 / 属性 目的
match(pattern, string, flags=0) 确定正则是否从字符串的开头匹配。
search(pattern, string, flags=0) 扫描字符串,查找此正则匹配的任何位置。
findall(pattern, string, flags=0) 找到正则匹配的所有子字符串,并将它们作为列表返回。
finditer(pattern, string, flags=0) 找到正则匹配的所有子字符串,并将它们返回为一个 iterator。

函数参数说明:

参数 描述
pattern 匹配的正则表达式
string 要匹配的字符串。
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
参见:[正则表达式修饰符 - 可选标志]

输入参数flag:

flag参数是一个位掩码,可以使用以下标志之一或它们的组合:

re.IGNORECASE:忽略大小写。

re.MULTILINE:多行模式,使元字符的行为与多行文本匹配。

re.DOTALL:使.元字符匹配任意字符,包括换行符。

re.VERBOSE:启用注释和白空格,允许在正则表达式中包含注释。

如果没有找到匹配, match()search() 返回 None 。如果它们成功, 一个 匹配对象 实例将被返回,包含匹配相关的信息:起始和终结位置、匹配的子串以及其它。

现在你可以检查 匹配对象 以获取有关匹配字符串的信息。 匹配对象实例也有几个方法和属性;最重要的是:

方法 / 属性 目的
group() 返回正则匹配的字符串
start() 返回匹配的开始位置
end() 返回匹配的结束位置
span() 返回包含匹配 (start, end) 位置的元组

group() 返回正则匹配的子字符串。

start()end() 返回匹配的起始和结束索引。

span() 在单个元组中返回开始和结束索引。 由于 match() 方法只检查正则是否在字符串的开头匹配,所以 start() 将始终为零。 但是,模式的 search() 方法会扫描字符串,因此在这种情况下匹配可能不会从零开始。

re.match函数

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

re.match(pattern, string, flags=0)
text = "The quick brown fox jumps over the lazy dog."

pattern = r'\b\w+\b'

words = re.findall(pattern, text)

print(words)

\b 是一个正则表达式的元字符,表示单词的边界。它用于匹配一个单词的开始或结尾位置,而不会匹配一个完整单词。

详细解释如下:

\b 是一个特殊的元字符,用于指示正则表达式的单词边界。这意味着它会匹配一个单词与非单词字符之间的位置。

当使用 \b 时,正则表达式会查找一个单词的开头或结尾位置,而不是匹配整个单词。例如,如果使用正则表达式 \bcat\b 来匹配字符串 “catdog”,它将不会匹配到整个单词 “cat”,因为 \b 将阻止它匹配 “cat” 的后面部分 “dog”。

\b 可以用于匹配独立的单词,或者用于分隔不同的单词。例如,可以使用正则表达式 \bapple\b 来匹配独立的单词 “apple”,或者使用正则表达式 \b\w+\b 来匹配一个或多个字母数字字符组成的单词。

\b 只匹配单词的边界位置,而不匹配单词本身。如果想要匹配整个单词,可以使用其他元字符或正则表达式的组合来实现。

总之,\b 是一个用于指示正则表达式中的单词边界的元字符,它可以帮助我们更精确地匹配字符串中的单词。

正则表达式学习网站

4种可以利用的情况:

  1. 匹配后面有PM的数字:\d+(?=PM)
  2. 匹配后面没有PM的数字:\d+(?!PM)
  3. 匹配前面有$的数字:(?<=\$)\d+
  4. 匹配前面没有$的数字:(?!\$)\d+

python正则表达式_第1张图片

python正则表达式_第2张图片
python正则表达式_第3张图片

python正则表达式_第4张图片

匹配标志位设置

Python默认是全局匹配,如果要修改为局部匹配,通过标志位re.LOCALE(缩写为re.L)进行设置,多行匹配的标志位为re.MULTIPLINE,可以缩写为re.M,还有忽略大小写通过re.IGNORECASE(缩写为re.I)进行控制。但是python的标志位设置能力很有限,因为它的匹配方法有多个。

  • re.match:从头开始匹配
  • re.search:全局匹配,只返回第一个符合条件的输入,输出为Match对象,
    • 使用group()方法可以获取得到内容
    • 使用span可以获取得到匹配子串的范围
    • 使用start可以获取匹配子串的起点
    • 使用end可以获取匹配子串的终点
  • re.findall:全局匹配,返回所有符合条件的输入,输出位列表形式
  • re.finditer:全局匹配,为了避免申请大量内存的列表,返回值是一个迭代器。
  • 全局匹配
  • 多行匹配
  • 忽略大小写

python正则表达式_第5张图片
python正则表达式_第6张图片

python正则表达式_第7张图片

python正则表达式_第8张图片

贪婪匹配和懒惰匹配

贪婪匹配有点类似于全局匹配,在匹配到第一个满足条件的内容时,仍然不停止,一直要穷尽所有的样例

懒惰匹配则刚好相反,匹配到第一个满足条件的就停止匹配。

python正则表达式_第9张图片
python正则表达式_第10张图片

你可能感兴趣的:(Python,python,正则表达式)