python之正则表达式5-特定序列

《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_]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sif_666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值