普通字符
import re
p = re.compile(r"test123")
print(p.search("atest123b")) #<re.Match object; span=(1, 8), match='test123'>
特殊字符(元字符)
- 有些字符它们和自身并不匹配,而是匹配一些与众不同的东西或者 影响正则表达式的其他部分(对其重复或改变含义)
- 元字符:. ^ $ * + ? { } \ | ( ) [] 最后两个会比较长,单独开一篇来讲
.
- 匹配除了换行符以外的任意一个字符
- DOTALL 模式下,它将匹配包括换行符的任意一个字符
import re
p = re.compile(r".")
print(p.match("abc")) # <re.Match object; span=(0, 1), match='a'>
print(p.match("\tbc")) # <re.Match object; span=(0, 1), match='\t'>
print(p.match("\nbc")) # None
p = re.compile(r".", flags=re.DOTALL)
print(p.match("\nbc")) # <re.Match object; span=(0, 1), match='\n'>
^
- 匹配字符串的第一行(^一般不会跨行匹配)
- MULTILINE 模式下,还会继续匹配换行后的开头
import re
p = re.compile(r"^ab")
print(p.findall("abcd\nabfg")) # ['ab'] 此时匹配的第一个ab
p = re.compile(r"^ab", flags=re.MULTILINE)
print(p.findall("abcd\nabfg")) # ['ab', 'ab']
$
- 匹配字符串最后一行($一般不会跨行匹配)
- MULTILINE 模式下,还会匹配换行符之前的末尾(换行符可以不在字符串末尾)
import re
p = re.compile(r"cd$")
print(p.findall("abcd\n")) #['cd']
p = re.compile(r"cd$", flags=re.MULTILINE)
print(p.findall("abcd\nefcd")) #['cd', 'cd']
"""
会找到两个(空的)匹配:一个在换行符之前,一个在字符串的末尾
"""
p = re.compile(r"$")
print(p.findall("abcd\n")) #['', '']
*
- 对它前面的正则表达式匹配0到任意次重复,尽量多的匹配(贪婪)
import re
p = re.compile(r"ab*")
print(p.search("a")) #<re.Match object; span=(0, 1), match='a'>
print(p.search("abbbc")) #<re.Match object; span=(0, 4), match='abbb'>
+
- 对它前面的正则表达式匹配1到任意次重复, 尽量多的匹配(贪婪)
import re
p = re.compile(r"ab+")
print(p.search("a")) #None
print(p.search("ab")) #<re.Match object; span=(0, 2), match='ab'>
print(p.search("abb")) #<re.Match object; span=(0, 3), match='abb'>
print(p.search("abbbc")) #<re.Match object; span=(0, 4), match='abbb'>
?
- 对它前面的正则表达式匹配0到1次, 尽量多的匹配(贪婪)
import re
p = re.compile(r"ab?")
print(p.search("a")) #<re.Match object; span=(0, 1), match='a'>
print(p.search("ab")) #<re.Match object; span=(0, 2), match='ab'>
print(p.search("abb")) #<re.Match object; span=(0, 2), match='ab'>
print(p.search("abbbc")) #<re.Match object; span=(0, 2), match='ab'>
{m}
- 对其之前的正则表达式指定匹配 m 个重复
import re
p = re.compile(r"ab{2}")
print(p.search("abc")) #None
print(p.search("abbc")) #<re.Match object; span=(0, 3), match='abb'>
print(p.search("abbbc")) #<re.Match object; span=(0, 3), match='abb'>
|
任意个正则表达式可以用 | 连接,比如 A|B 表示匹配正则表达式 A 或者 B,一旦有一个先匹配成功,另外的就不会再进行匹配
import re
p = re.compile(r"d|e|b")
print(p.search("abc")) #<re.Match object; span=(1, 2), match='b'>
print(p.search("aebcd")) #<re.Match object; span=(1, 2), match='e'>
\
- 转义特殊字符
import re
# 只匹配*号
p = re.compile(r"*")
print(p.fullmatch("*")) #<re.Match object; span=(0, 1), match='*'>
# 只匹配+号
p = re.compile(r"+")
print(p.fullmatch("+")) #<re.Match object; span=(0, 1), match='+'>
# 只匹配?号
p = re.compile(r"?")
print(p.fullmatch("?")) #<re.Match object; span=(0, 1), match='?'>
- 用来表示一个特殊序列(由 \和一个字符组成的特殊序列)
-
\number
匹配数字代表的分组里面的内容(每个括号是一个子组,子组从1 开始编号),在 [ 和 ] 字符集内,任何数字转义都被看作是字符
import re
""" \1匹配的内容和第1组一定一样 """
p = re.compile(r"(.+) \1")
print(p.search("ab abc")) #<re.Match object; span=(0, 5), match='ab ab'>
print(p.search("5 5")) #<re.Match object; span=(0, 3), match='5 5'>
""" 两个组匹配的内容不一定一样 """
p = re.compile(r"(.+) (.+)")
print(p.search("ab abc")) #<re.Match object; span=(0, 6), match='ab abc'>
print(p.search("5 5")) #<re.Match object; span=(0, 3), match='5 5'>
\A
- 匹配字符串的开头,类似于 ^,区别在于:MULTILINE模式下, \A 不识别换行
\b
- 匹配空字符串,但只在单词开始或结尾的位置,即匹配一个单词边界
\B
- 匹配空字符串,但不能在单词开始或结尾的位置,即匹配非单词边界
\D
- 匹配任意一个非数字字符,等价于 [^0-9]
\s
- 匹配任何一个空白符
\S
- 匹配任何一个非空白符
\w
- 匹配一个字母或一个数字或一个下划线,等价于 [a-zA-Z0-9_]
\W
- 匹配一个非字母非数字非下划线的字符,等价于 [^a-zA-Z0-9_]
\Z
- 只匹配字符串的末尾,且 MULTILINE 模式下,\Z 不识别换行
\n \t \ ' "
- 绝大部分Python的标准转义字符也被正则表达式分析器支持