在《python之正则表达式2》中我提到了 反斜杠(’\’)在正则表达式中有两种作用:1. 特殊字符转义;2. 表示特定的序列;前面只介绍了第一种,本篇博客来介绍第2种。
正则的特定序列
通常,我们可以使用[0-9]
来表示数字,[a-zA-Z]
来表示字母等,显然这些写法敲键盘的次数有点儿多,程序员一般是很懒的,越简单越好。所以这就产生了 速记法。
当想要验证用户输入的内容的是正确性时,可使用定位符。例如,输入手机号,只允许是数字。可使用正则表达式^\d+$
import re
test_str1 = 'a137d11fd112dfa222'
RE_ANCHOR1 = '\d+'
test_str2 = '13711112222'
RE_ANCHOR2 = '^\d+$'
for e in re.finditer(RE_ANCHOR1, test_str1):
print(e)
# <re.Match object; span=(1, 4), match='137'>
# <re.Match object; span=(5, 7), match='11'>
# <re.Match object; span=(9, 12), match='112'>
# <re.Match object; span=(15, 18), match='222'>
print(re.search(RE_ANCHOR2, test_str2))
# <re.Match object; span=(0, 11), match='13711112222'>
在处理字符串时,有时候我们想要将字符串头尾的空格去掉,那么首要问题是得先找到空格的位置,下面这个例子就是介绍怎样定位空格。
import re
test_str1 = ' 渔道的qq群号是831818315 '
RE_WHITESPACE = r'^\s+|\s+$'
for e in re.finditer(RE_WHITESPACE, test_str1):
print(e)
# <re.Match object; span=(0, 1), match=' '>
# <re.Match object; span=(18, 19), match=' '>
某个位置的前面是word charactor 或者 某个位置的后面是 word charactor。
单词边界(word boundaries)
单词边界有三种:
- 字符串中的第一个单词且该单词的第一个字母之前的位置
- 字符串中的最后一个单词且该单词的最后一个字母之后的位置
- 字符串中两个字符之间的位置,一个字符是单词的字母,另一个字符是非单词字符
\b
Matches the empty string, but only at the beginning or end of a word.
\b
也是零宽匹配,它匹配的位置是 单词边界。这个’单词’的表达并不准确,更准确的表达应该是字母数字序列
。
所以 \b
的作用的中文准确表达是:匹配 字母数字序列
的边界位置。
import re
test_str1 = 'this issue is easy.'
test_str2 = 'is this issue easy?'
test_str3 = 'this issue is'
RE_WORD_BOUNDARIES = r'\bis\b'
for e in re.finditer(RE_WORD_BOUNDARIES, test_str1):
print(f'test_str1 匹配结果是:{e}')
# test_str1 匹配结果是:<re.Match object; span=(11, 13), match='is'>
# 说明 匹配的是第三个'is',也就是is这个单词,而不会匹配命中含有is的单词.但匹配的位置在字符串中间
for e in re.finditer(RE_WORD_BOUNDARIES, test_str2):
print(f'test_str2 匹配结果是:{e}')
# test_str2 匹配结果是:<re.Match object; span=(0, 2), match='is'>
# 说明 匹配的是第一个'is'.匹配的位置是字符串的开始
for e in re.finditer(RE_WORD_BOUNDARIES, test_str3):
print(f'test_str3 匹配结果是:{e}')
# test_str3 匹配结果是:<re.Match object; span=(11, 13), match='is'>
# 说明 匹配的是第三个'is'.匹配的位置是字符串的末尾
从上面的例子可以看出,通常\b
用于精确提取某个字母数字序列
(包含单词)。
\B
Matches the empty string, but only when it is not at the beginning or end of a word.
\B也是零宽匹配,它刚好和\b
相反,匹配 字母数字序列
的非边界位置。
import re
test_str1 = 'this issue is easy.'
RE_WORD_BOUNDARIES = r'is\B'
RE_WORD_BOUNDARIES2 = r'\Bis'
test_str3 = 'whoisTrump'
RE_WORD_BOUNDARIES3 = r'\Bis\B'
for e in re.finditer(RE_WORD_BOUNDARIES, test_str1):
print(f'test_str1 匹配结果是:{e}')
# test_str1 匹配结果是:<re.Match object; span=(5, 7), match='is'>
# 说明 匹配的是第二个'is',匹配的位置是issue的'is'和'sue'之间的位置
for e in re.finditer(RE_WORD_BOUNDARIES2, test_str1):
print(f'test_str1 匹配结果是:{e}')
# test_str1 匹配结果是:<re.Match object; span=(2, 4), match='is'>
# 说明 匹配的是第一个'is',匹配的位置是this的'th'和'is'之间的位置
for e in re.finditer(RE_WORD_BOUNDARIES3, test_str3):
print(f'test_str3 匹配结果是:{e}')
# test_str3 匹配结果是:<re.Match object; span=(3, 5), match='is'>
# 因为'is'两边没有边界,所以匹配命中
\d
一般是指匹配数字,如,[0-9]
\D
一般是指 匹配非数字 字符,如,[^0-9]
\s
一般是指 匹配"空格"字符,空格字符包含[ \t\n\r\f\v]
\D
一般是指 匹配非"空格"字符,如,[^ \t\n\r\f\v]
\w
一般是指 匹配字母数字下划线,如,[a-zA-Z0-9_]
\W
一般是指 匹配 非字母数字下划线,如,[^a-zA-Z0-9_]