Python的re模块中的search方法

ret=re.search(r'\d*','hello999')
print(ret.group())
结果不符合预期:999

阅读 7.1k
2 个回答

首先,search的定义如下:
图片描述

其次,你写的这个正则的匹配情况如下:
图片描述

所以,第一个匹配的是第一个字母h之前的位置,所以你用group()去获取数据,当然返回空字符串

1、首先,先看看正则的基本元字符:

代码 说明
. 匹配除换行符(n, r)之外的任意 单个 字符。
\w 匹配大小写字母、或数字、或下划线。等价于[A-Za-z0-9_]。
\W 跟小写的 w 正好相反。等价于1
\s 匹配任意的空白字符,包括空格、制表符、换页符等。等价于[fnrtv]。
\S 跟小写的 s 正好相反。等价于2
\d 匹配一个数字字符,等价于[0-9]。
\D 匹配一个非数字字符,等价于3
\b 匹配一个单词的边界,也就是单词和空格的位置。
例如, 'erb' 可匹配 'never' 中的 'er',但不匹配 'verb' 中的 'er'。
^ 匹配输入字符串开始位置。
$ 匹配输入字符串的结束位置。
[] 匹配[]中列举的字符。

2、然后,我们再看看正则的代表重复的字符

代码/语法 说明
* 重复匹配前面的子表达式零次或更多次
+ 重复匹配前面的子表达式一次或更多次
? 重复匹配前面的子表达式零次或一次
{n} 重复匹配前面的子表达式n次
{n,} 重复匹配前面的子表达式n次或更多次
{n,m} 重复匹配前面的子表达式n到m次

3、承上,根据你的例子,我们需要的是这样一个正则:

ret=re.search(r'\d+','hello999')
print(ret.group())

4、现在我们来说说你的正则为什么不成功

4.1、首先看看 re.search 函数的定义

re.search 扫描整个字符串并返回 第一个 成功 的匹配。

从字符串最左边开始匹配,只要匹配到第一个,那就返回,不管其它。

4.2、再看你的正则

ret=re.search(r'd*','hello999')
print(ret.group())

你用了一个 r'd*', 在此表示字符串 d 出现零次或多次,记住出现零次这个概念,那就是一个空字符。你的正则就匹配了 hello 最左边的一个空字符。

当然,我明白题主的意思是为了匹配数字字符,但是很遗憾,只有 \d 才等价与 [0-9], d 仅仅是字符串 d 而已。

要想表达实现一次或多次,那么你得使用 + ,
所以最终的表达式应该是 r'、d+'。


  1. A-Za-z0-9_
  2. fnrtv
  3. 0-9
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题