Python 正则表达式
Python 正则表达式是一种用来匹配和处理字符串的强大工具。Python提供了re模块来支持正则表达式的使用。
re模块常用函数
-
re.compile(pattern, flags=0)
: 根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。 -
re.search(pattern, string, flags=0)
: 扫描整个字符串并返回第一个成功的匹配对象,如果没有匹配则返回None。 -
re.match(pattern, string, flags=0)
: 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,返回None。 -
re.fullmatch(pattern, string, flags=0)
: 尝试匹配整个字符串,如果匹配成功则返回一个匹配对象,否则返回None。 -
re.split(pattern, string, maxsplit=0, flags=0)
: 根据模式的出现位置分割字符串,返回一个列表。 -
re.findall(pattern, string, flags=0)
: 返回一个列表,包含字符串中所有与模式匹配的子串。 -
re.finditer(pattern, string, flags=0)
: 返回一个迭代器,每次返回一个匹配对象。 -
re.sub(pattern, repl, string, count=0, flags=0)
: 使用指定的替换字符串(可以是一个函数)替换字符串中与模式匹配的部分,返回修改后的字符串。 -
re.subn(pattern, repl, string, count=0, flags=0)
: 与re.sub
类似,但返回一个元组,包含修改后的字符串和替换次数。 -
re.escape(pattern)
: 对模式中的特殊字符进行转义,返回一个合法的正则表达式。 -
re.split(pattern, string, maxsplit=0, flags=0)
: 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下: 参数:
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串。 |
maxsplit | 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。 |
flags | 标志位,参见:正则表达式修饰符 -flags |
匹配对象
我们可以使用 group() 或 groups() 匹配对象函数来获取匹配表达式。
匹配对象方法 | 描述 |
---|---|
group(num=0) | 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。 |
groups() | 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。 |
正则表达式修饰符 -flags
可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
- re.I 忽略大小写
- re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
- re.M 多行模式
- re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
- re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
- re.X 为了增加可读性,忽略空格和 # 后面的注释
正则表达式语法
正则表达式的模式字符串由一些特殊的字符和符号组成,用来表示不同的匹配规则。这些特殊字符和符号有:
-
.
:匹配除换行符之外的任何字符(除非指定了re.DOTALL
标志)。 -
^
:匹配字符串的开头(除非指定了re.MULTILINE
标志,此时也可以匹配每行的开头)。 -
$
:匹配字符串的结尾(除非指定了re.MULTILINE
标志,此时也可以匹配每行的结尾)。 -
*
:匹配前一个字符零次或多次,贪婪模式。 -
+
:匹配前一个字符一次或多次,贪婪模式。 -
?
:匹配前一个字符零次或一次,或者表示非贪婪模式。 -
{m}
:匹配前一个字符m次。 -
{m,n}
:匹配前一个字符m到n次,贪婪模式。 -
{m,n}?
:匹配前一个字符m到n次,非贪婪模式。 -
[...]
:定义一个字符集合,匹配其中任意一个字符。可以使用范围表示法(如[a-z]
)或者单独列出(如[abc]
)。如果在开头使用^
表示取反(如[^a-z]
)。 -
[^...]
:定义一个排除型字符集合,匹配不在其中的任意字符。 -
\
:转义符,用于取消特殊字符的特殊含义,或者表示一些预定义的字符类别。例如:\d
:匹配任意数字,等同于[0-9]
。\D
:匹配任意非数字,等同于[^0-9]
。\s
:匹配任意空白字符,等同于[ \t\n\r\f\v]
。\S
:匹配任意非空白字符,等同于[^ \t\n\r\f\v]
。\w
:匹配任意字母数字下划线,等同于[a-zA-Z0-9_]
。\W
:匹配任意非字母数字下划线,等同于[^a-zA-Z0-9_]
。\b
:匹配单词边界,即单词和空格之间的位置。\B
:匹配非单词边界,即单词内部的位置。\A
:匹配字符串的开头,忽略多行模式。\Z
:匹配字符串的结尾,忽略多行模式。\n, \t, \r, \f, \v, \\, \', \", \
等:表示对应的特殊字符。
-
|
:逻辑或操作符,表示两个子表达式之间的选择关系。 -
(...)
:分组符号,用于将多个字符作为一个整体进行处理或者提取。每个分组都有一个编号,从1开始。可以使用\1
,\2
, 等引用分组中的内容。 -
(?...)
: 扩展表示法,用于指定一些额外的匹配条件或者修改匹配模式。例如:(?iLmsux)
: 在正则表达式中嵌入一个或多个标志,影响正则表达式的行为。例如,(?i)
表示忽略大小写, 等同于re.IGNORECASE
.(?:...)
: 非捕获分组, 表示一个不需要提取的分组, 不会分配编号.(?P<name>...)
: 命名分组, 给分组指定一个名字, 可以使用(?P=name)
引用分组中的内容.(?P=name)
: 反向引用命名分组, 匹配与指定名字的分组内容相同的字符串.(?#...)
: 注释, 括号中的内容会被忽略, 不影响正则表达式的功能.(?=...)
: 正向肯定预查, 表示后面的字符串必须满足括号中的条件, 但不包含在匹配结果中.(?!...)
: 正向否定预查, 表示后面的字符串必须不满足括号中的条件, 但不包含在匹配结果中.(?<=...)
: 反向肯定预查, 表示前面的字符串必须满足括号中的条件, 但不包含在匹配结果中.(?<!...)
: 反向否定预查, 表示前面的字符串必须不满足括号中的条件, 但不包含在匹配结果中.