鱼C论坛

 找回密码
 立即注册
查看: 1455|回复: 3

[已解决]re模块如果不想分组但是又需要括号该怎么办?

[复制链接]
发表于 2019-7-16 11:38:49 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 毛毛不爱读书 于 2019-7-16 11:48 编辑

如下代码:
  1. import re
  2. zfc = "My number is 415-555-4242. and my brother's is 876-9876"
  3. phoneNumRegex = re.compile(r'(\d{3}-)?\d{3}-\d{4}')
  4. mo = phoneNumRegex.findall(zfc)
  5. print(type(mo))
  6. print(mo)
复制代码


输出如下:
  1. <class 'list'>
  2. ['415-', '']
复制代码


我的本意, 是'(\d{3}-)'可以有也可以没有, 并不是要用小括号分组.
然而在用findall()方法匹配模式的时候, 输出的结果, 把小括号当做分组来看了, 不是我想要的['415-555-4242', '876-9876']


---------
最佳答案
2019-7-16 12:53:14
可以在括号前加上?:
  1. >>> import re
  2. >>> zfc = "My number is 415-555-4242. and my brother's is 876-9876"
  3. >>> pat = re.compile(r'(?:\d{3}-)?\d{3}-\d{4}')
  4. >>> match = pat.search(zfc)
  5. >>> match.group(0)
  6. '415-555-4242'
  7. >>> pat.findall(zfc)
  8. ['415-555-4242', '876-9876']
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-7-16 12:01:00 | 显示全部楼层
我又试了一下finditer()方法, 能够得到想要的结果:
  1. import re
  2. zfc = "My number is 415-555-4242. and my brother's is 876-9876"
  3. phoneNumRegex = re.compile(r'(\d{3}-)?\d{3}-\d{4}')
  4. mo = phoneNumRegex.finditer(zfc)
  5. print(type(mo))
  6. print(mo)
  7. for each in mo:
  8.     print(type(each))
  9.     print(each.group())
复制代码


结果如下:
  1. <class 'callable_iterator'>
  2. <callable_iterator object at 0x000001E8F269C7F0>
  3. <class 're.Match'>
  4. 415-555-4242
  5. <class 're.Match'>
  6. 876-9876
复制代码


-----------
感觉match(), search(), finditer() 3个方法是一个类型的, 得到的都是match对象. 区别是match匹配字符串开头1个, search()匹配第1个, finditer()匹配所有符合条件的.
而findall()不同, 匹配所有的, 但返回的结果, 是一个列表, 而且如果有括号的话, 会强制按小括号分组, 只返回分组的结果, 不一定符合要求.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-16 12:53:14 | 显示全部楼层    本楼为最佳答案   
可以在括号前加上?:
  1. >>> import re
  2. >>> zfc = "My number is 415-555-4242. and my brother's is 876-9876"
  3. >>> pat = re.compile(r'(?:\d{3}-)?\d{3}-\d{4}')
  4. >>> match = pat.search(zfc)
  5. >>> match.group(0)
  6. '415-555-4242'
  7. >>> pat.findall(zfc)
  8. ['415-555-4242', '876-9876']
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-16 14:09:10 | 显示全部楼层
DT_Nelson 发表于 2019-7-16 12:53
可以在括号前加上?:

这样确实可以, 我去补补课. 感谢3楼.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 22:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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