字符串的表现形式
‘\n’: 代表一个字符 n,即 len(‘\n’) == 1,只是这个 n 的意思(换行)与平时(字母 n)不一样,故称为「转义字符」,反斜杠标识该字符与众不同而已。
r’\n’: 代表两个字符,即 len(r’\n’) == 2,一个是反斜杠,一个是字母 n 。r 全称 raw,意为原生的、未加工的。
正则表达式前都应加 r,这样就不用考虑转义问题。也就是避免了把 Python 字符串翻译成正则字符串出现的不一致。
元字符
正则表达式由「普通字符」和「元字符」组成,其中元字符又分为:基本元字符、预设元字符等。
基本原字符:
.:匹配除换行符以外的任意一个字符\: 转义字符,使元字符具有本来的意义,也就是把元字符变为普通字符。
[…]:匹配方括号中的任意一个字符, “[]” 中的元字符失效,变为普通字符
[^ …]:字符集取反,表示只要不是括号中出现的字符都可以匹配
预设元字符
\s:匹配一个空白字符,空格、换行等,与 \S 相反
\d:匹配一个数字,即:[0-9],与 \D 相反
\w:匹配一个字母、数字、下划线,即:[A-Za-z0-9_],与 \W 相反
边界匹配
^:匹配字符开头
$:匹配字符结尾
重复匹配
- 重复匹配 x 次,即零次或以上
? 重复匹配零次或者一次
- 重复匹配一次或者多次
{n} 重复匹配n次
{n,} 重复匹配至少n次
{n, m} 重复匹配n到m次
逻辑分支
逻辑分支条件字符 |,它把表达式分为左右两部分,先尝试匹配左边部分,如果匹配成功就不再匹配右边部分了。
API
re.findall(pattern, string)
>>> re.findall(r'\w', 'js75sd')['j', 's', '7', '5', 's', 'd']
re.sub(pattern, repl, string)
>>> re.sub(r'\d','AA', 'js75sd')'jsAAAAsd'
re.split(pattern, string)
>>> re.split(r'\W+', 'word, Word, word.')['word', 'Word', 'word', '']
re.match(pattern, string).group()
# 圆括号括起来表示分组print(re.match(r"(\d+)(\w+)", "1234abcd").group()) # 1234abcdprint(re.match(r"(\d+)(\w+)", "1234abcd").group(0)) # 同上print(re.match(r"(\d+)(\w+)", "1234abcd").group(1)) # 1234print(re.match(r"(\d+)(\w+)", "1234abcd").group(2)) # abcd# 指定组名:(?P<name>正则)print(re.match(r"(?P<dig>\d+)(\w+)", "1234abcd").group('dig')) # 1234
re.compile(pattern).match(string).group()
用到 match 都是返回匹配的第一个。
