鱼C论坛

 找回密码
 立即注册
查看: 1910|回复: 4

[已解决]正则小问题:*符号匹配的结果

[复制链接]
发表于 2017-8-23 00:02:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
*号匹配结果让我很疑惑
为什么对重复的字符串返回的结果是0次(例如‘abxxxb’,用‘x*’匹配出来的却是空字符,这一点都不贪婪啊)
而对HTML/XML的内容<....><.....><....>匹配却表现出贪婪呢
最佳答案
2017-8-23 09:37:01
本帖最后由 ba21 于 2017-8-23 09:54 编辑

*        匹配前面的子表达式零次或多次,等价于 {0,}
+        匹配前面的子表达式一次或多次,等价于 {1,}

例如 ca*t 将匹配 ct(0 个字符 a),cat(1 个字符 a),caaat(3 个字符 a)

没问题,很好理解
  1. >>> re.search(r"x*","abxxxb")
  2. <_sre.SRE_Match object; span=(0, 0), match=''>
  3. >>> re.search(r"x+","abxxxb")
  4. <_sre.SRE_Match object; span=(2, 5), match='xxx'>


  5. >>> re.search(r"ca*t","ct")#匹配a  0次
  6. <_sre.SRE_Match object; span=(0, 2), match='ct'>
  7. >>> r=re.search(r"ca*t","ct")
  8. >>> r.group()
  9. 'ct'

  10. >>> re.search(r"ca*t","cat")#匹配a  1次
  11. <_sre.SRE_Match object; span=(0, 3), match='cat'>
  12. >>> r=re.search(r"ca*t","cat")
  13. >>> r.group()
  14. 'cat'

  15. >>> re.search(r"ca*t","caaat")#匹配a  3次
  16. <_sre.SRE_Match object; span=(0, 5), match='caaat'>
  17. >>> r=re.search(r"ca*t","caaat")
  18. >>> r.group()
  19. 'caaat'

  20. #所以你按你的思中可以写成这样。
  21. >>> re.search(r"bx*","abxxxb")
  22. <_sre.SRE_Match object; span=(1, 5), match='bxxx'>
  23. >>> re.search(r"abx*b","abxxxb")
  24. <_sre.SRE_Match object; span=(0, 6), match='abxxxb'>
  25. >>> re.search(r"x*b","abxxxb")
  26. <_sre.SRE_Match object; span=(1, 2), match='b'>
  27. >>> re.search(r"ax*b","abxxxb")
  28. <_sre.SRE_Match object; span=(0, 2), match='ab'>

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

使用道具 举报

发表于 2017-8-23 09:37:01 | 显示全部楼层    本楼为最佳答案   
本帖最后由 ba21 于 2017-8-23 09:54 编辑

*        匹配前面的子表达式零次或多次,等价于 {0,}
+        匹配前面的子表达式一次或多次,等价于 {1,}

例如 ca*t 将匹配 ct(0 个字符 a),cat(1 个字符 a),caaat(3 个字符 a)

没问题,很好理解
  1. >>> re.search(r"x*","abxxxb")
  2. <_sre.SRE_Match object; span=(0, 0), match=''>
  3. >>> re.search(r"x+","abxxxb")
  4. <_sre.SRE_Match object; span=(2, 5), match='xxx'>


  5. >>> re.search(r"ca*t","ct")#匹配a  0次
  6. <_sre.SRE_Match object; span=(0, 2), match='ct'>
  7. >>> r=re.search(r"ca*t","ct")
  8. >>> r.group()
  9. 'ct'

  10. >>> re.search(r"ca*t","cat")#匹配a  1次
  11. <_sre.SRE_Match object; span=(0, 3), match='cat'>
  12. >>> r=re.search(r"ca*t","cat")
  13. >>> r.group()
  14. 'cat'

  15. >>> re.search(r"ca*t","caaat")#匹配a  3次
  16. <_sre.SRE_Match object; span=(0, 5), match='caaat'>
  17. >>> r=re.search(r"ca*t","caaat")
  18. >>> r.group()
  19. 'caaat'

  20. #所以你按你的思中可以写成这样。
  21. >>> re.search(r"bx*","abxxxb")
  22. <_sre.SRE_Match object; span=(1, 5), match='bxxx'>
  23. >>> re.search(r"abx*b","abxxxb")
  24. <_sre.SRE_Match object; span=(0, 6), match='abxxxb'>
  25. >>> re.search(r"x*b","abxxxb")
  26. <_sre.SRE_Match object; span=(1, 2), match='b'>
  27. >>> re.search(r"ax*b","abxxxb")
  28. <_sre.SRE_Match object; span=(0, 2), match='ab'>

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-23 10:11:18 | 显示全部楼层
本帖最后由 xiefei1986 于 2017-8-23 10:15 编辑

>>> re.search(r"x*b","axxxb")
<_sre.SRE_Match object; span=(1, 5), match='xxxb'>
>>> re.search(r"x*b","abxxxb")
<_sre.SRE_Match object; span=(1, 2), match='b'>

这个*还不是很理解,如上两个  表达式是一样的,但结果并不是预期的'xxxb'
什么情况下*代表0次,什么情况下*又代表多次呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-23 22:49:08 | 显示全部楼层
xiefei1986 发表于 2017-8-23 10:11
>>> re.search(r"x*b","axxxb")

>>> re.search(r"x*b","abxxxb")

扩展阅读里的正则表达式一中
在‘重复的事情’有说到*号贪婪匹配的步骤
按他那个步骤是可以得到你的结果的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-28 09:48:50 | 显示全部楼层
Barnett_xxf 发表于 2017-8-23 22:49
扩展阅读里的正则表达式一中
在‘重复的事情’有说到*号贪婪匹配的步骤
按他那个步骤是可以得到你的结 ...

有这个扩展阅读吗?没看到啊。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-30 06:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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