鱼C论坛

 找回密码
 立即注册
查看: 2025|回复: 2

[已解决]关于正则表达式中 子组()与'+'搭配的问题?

[复制链接]
发表于 2017-3-30 23:21:20 | 显示全部楼层 |阅读模式
30鱼币
目前学习python中的正则表达式,发现了一个让自己琢磨不透的现象,希望有大侠能解答:

就是
(1)re.findall('(\w)+','abcd')为什么返回的结果是['d']。也就是说为什么返回的是字符串'abcd'的最后一个字符'd'?
(2)re.findall('(\w)?','abcd')为什么返回的结果是['a', 'b', 'c', 'd', '']?
(3)re.findall('(\w)*','abcd')为什么返回的结果是['d', '']?
最佳答案
2017-3-30 23:21:21
findall 表示多次搜索整个字符串
优先返回分组中捕获的内容
单次搜索中如果捕获多个分组,默认返回最后捕获的那个。
  1. >>> import re
  2. >>> s='abcd'
  3. >>> exp=(r'(\w)+',r'(\w)?',r'(\w)*')
  4. >>> for e in exp:
  5.         print('\n表达式:',e)
  6.         for i,m in enumerate(re.finditer(e,s)):
  7.                 print('第%d次搜索'%(i+1), m.group(), m.groups(),sep='\n')

  8.                

  9. 表达式: (\w)+
  10. 第1次搜索
  11. abcd
  12. ('d',)

  13. 表达式: (\w)?
  14. 第1次搜索
  15. a
  16. ('a',)
  17. 第2次搜索
  18. b
  19. ('b',)
  20. 第3次搜索
  21. c
  22. ('c',)
  23. 第4次搜索
  24. d
  25. ('d',)
  26. 第5次搜索

  27. (None,)

  28. 表达式: (\w)*
  29. 第1次搜索
  30. abcd
  31. ('d',)
  32. 第2次搜索

  33. (None,)
复制代码

最佳答案

查看完整内容

findall 表示多次搜索整个字符串 它优先返回分组中捕获的内容 在单次搜索中如果捕获多个分组,默认返回最后捕获的那个。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-3-30 23:21:21 | 显示全部楼层    本楼为最佳答案   
findall 表示多次搜索整个字符串
优先返回分组中捕获的内容
单次搜索中如果捕获多个分组,默认返回最后捕获的那个。
  1. >>> import re
  2. >>> s='abcd'
  3. >>> exp=(r'(\w)+',r'(\w)?',r'(\w)*')
  4. >>> for e in exp:
  5.         print('\n表达式:',e)
  6.         for i,m in enumerate(re.finditer(e,s)):
  7.                 print('第%d次搜索'%(i+1), m.group(), m.groups(),sep='\n')

  8.                

  9. 表达式: (\w)+
  10. 第1次搜索
  11. abcd
  12. ('d',)

  13. 表达式: (\w)?
  14. 第1次搜索
  15. a
  16. ('a',)
  17. 第2次搜索
  18. b
  19. ('b',)
  20. 第3次搜索
  21. c
  22. ('c',)
  23. 第4次搜索
  24. d
  25. ('d',)
  26. 第5次搜索

  27. (None,)

  28. 表达式: (\w)*
  29. 第1次搜索
  30. abcd
  31. ('d',)
  32. 第2次搜索

  33. (None,)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-3-31 15:36:09 | 显示全部楼层
SixPy 发表于 2017-3-31 10:35
findall 表示多次搜索整个字符串
它优先返回分组中捕获的内容
在单次搜索中如果捕获多个分组,默认返回最 ...

谢谢版主的帮助,我大概懂了。
另外,想请问您,re.findall()方法返回值的规则与迭代器re.finditer()方法的规则是否相同呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-26 13:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表