跳转至

正则表达式笔记

语法:/ 匹配 /修饰

Online Tool

python re

Python
1
import re

修饰

  • ignore case:忽略大小写。

  • global search: Retain the index of the last match, allowing subsequent searches to start from the end of the previous match. Without the global flag, subsequent searches will return the same match.

  • multiline:正则表达式中的 ^$ 将会分别匹配输入字符串中的每一行的开始和结束,而不是整个字符串的开始和结束。

  • unicode:可以使用扩展的unicode转义形式\x{FFFFF}

字符匹配

基本字符

  • . :在正则表达式中,点(.)匹配除换行符(\n)之外的任意单个字符。

  • [] 字符集:字符集用于匹配方括号内的任意一个字符。例如,[abc]可以匹配abc中的任意一个字符。

  • [a-z] 范围:表示匹配从az的任意一个小写字母。

  • [a-zA-Z]:表示匹配从az的任意一个小写字母或从AZ的任意一个大写字母。

  • [^a-z] 取反:当方括号内的第一个字符是^时,表示取反,即匹配任何不在方括号内的字符。例如,[^a-z]将匹配除小写字母之外的任意字符。

  • [^a-zA-Z]:表示匹配除小写字母和大写字母之外的任意字符。

预定义字符类

  • \d:匹配任何数字字符,等价于 [0-9]

  • \D:匹配任何非数字字符,等价于 [^0-9]

  • \w:匹配任何单词字符,包括字母、数字和下划线,等价于 [a-zA-Z0-9_]

  • \W:匹配任何非单词字符,等价于 [^a-zA-Z0-9_]

  • \s:匹配任何空白字符,包括空格、制表符、换行符等,等价于 [ \f\n\r\t\v]

  • \S:匹配任何非空白字符,等价于 [^ \f\n\r\t\v]

这些预定义的字符类在正则表达式中非常方便,因为它们提供了一种快速的方式来匹配常见的字符类型,而不需要手动列出所有可能的字符。

位置和边界匹配

  • ^:匹配输入字符串的开始位置,如果在多行模式下(m标志),则匹配每一行的开始位置。

  • $:匹配输入字符串的结束位置,如果在多行模式下(m标志),则匹配每一行的结束位置。

  • \b:匹配一个单词边界,即单词字符和非单词字符之间的位置。例如,\bworld\b可以匹配hello world中的world,但是不会匹配worlds中的world

  • \B:匹配非单词边界,即两个单词字符之间的位置,或两个非单词字符之间的位置。例如,\Bworld\B不会匹配hello world中的world。但是会匹配eworlds中的world

量词

基本

  • + 加号:匹配前面的字符出现1次或多次。

  • ? 问号:匹配前面的字符出现0次或1次。

  • * 星号:匹配前面的字符出现0次或多次。

  • {3}:匹配前面的字符恰好出现3次。

  • {3,5}:匹配前面的字符出现3到5次。

  • {3,}:匹配前面的字符出现3次或更多次。

贪婪匹配

在正则表达式中,量词默认贪婪匹配,会匹配尽可能多的字符。

例如,对于字符串abcabc,使用正则表达式a.*c进行匹配时,贪婪匹配会匹配整个字符串abcabc,而懒惰匹配(非贪婪匹配)会匹配第一个abc

懒惰匹配

在量词后面加?为懒惰匹配,会匹配尽可能少的字符。

例如,使用正则表达式\d*?abc\d*?对同样的字符串123abc456进行匹配时,懒惰匹配会尽可能少地匹配数字,因此它会匹配123456之间的abc

分组和引用

() 捕获分组

捕获分组用于将匹配的一部分作为单独的一个组进行捕获,方便后续的引用和操作。

  • (at):这将匹配"at"这个词,并将其作为一个分组。

  • pattern|Pattern:使用竖线|表示匹配pattern或者Pattern。

  • (p|P)attern:匹配"pattern"或"Pattern"。

$1 替换

捕获分组在替换操作中可以通过\(1、\)2等来引用。

日期替换:yyyy-MM-dd \(\to\) MM-dd-yyyy

Text Only
1
(\d{4})-(\d{1,2})-(\d{1,2})
Text Only
1
$2-$3-$1

所有日期格式:

Text Only
1
(\d{4})[-/._]?(\d{1,2})[-/._]?(\d{1,2})

(?:) 非捕获分组

非捕获分组用于组合表达式的一部分,但不捕获匹配的文本,不存储分组值,也不影响\(1、\)2等分组引用。

  • (?:pattern):匹配pattern但不捕获匹配的文本。

\1 引用

\1\2等用于向后引用前面的捕获分组。

  • 匹配相邻的两个相同的单词:

(\w+) \1

断言

断言用于指定匹配的条件,只有当条件满足时才会匹配成功。

(?=) (?!) 先行断言 Lookahead

  • \b\w+\b(?=ing\b):匹配以"ing"结尾的单词。

  • \b\w+\b(?!ing\b):匹配不以"ing"结尾的单词。

(?<=) (?<!) 后行断言 Lookbehind

  • (?<=\$)\d+:匹配一串数字,仅当它前面有一个$符号时。

  • (?<!\d)\d:匹配一个数字,仅当它前面没有数字时。

参考

30分钟正则表达式教程

评论