免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1925 | 回复: 9
打印 上一主题 下一主题

求助正则表达式问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-22 10:14 |只看该作者 |倒序浏览
我想匹配字符串以数字开头,以字母结尾,最少1个数字,最多3个数字,最少1个字母,最多2个字母。

比如:s='4j'或者ss = '345og'

>>> s='4j'
>>> ss = '345og'
>>> s
'4j'
>>> ss
'345og'
>>> re.search('^[0-9]{1,3}[a-zA-Z]{1,2}$',ss).group()
'345og'
>>> re.search('^[0-9]{1,3}[a-zA-Z]{1,2}$',s).group()
'4j'

但是,字符串s='456jk,56h,123ed'却不能匹配,如下所示:
>>> s='456jk,56h,123ed'
>>> re.search('^[0-9]{1,3}[a-zA-Z]{1,2}$',s).group()
Traceback (most recent call last):
  File "<pyshell#25>", line 1, in <module>
    re.search('^[0-9]{1,3}[a-zA-Z]{1,2}$',s).group()
AttributeError: 'NoneType' object has no attribute 'group'
>>> re.search('^[0-9]{1,3}[a-zA-Z]{1,2}$',s).group()
Traceback (most recent call last):
  File "<pyshell#28>", line 1, in <module>
    re.search('^[0-9]{1,3}[a-zA-Z]{1,2}$',s).group()
AttributeError: 'NoneType' object has no attribute 'group'

不知道问题出在哪里?

论坛徽章:
0
2 [报告]
发表于 2009-06-22 10:43 |只看该作者
要么把'456jk,56h,123ed'按逗号分割分别匹配,要么试试^[0-9]{1,3}[^\da-zA-Z]*[a-zA-Z]{1,2}$

论坛徽章:
0
3 [报告]
发表于 2009-06-22 11:04 |只看该作者
原帖由 wangcn 于 2009-6-22 10:43 发表
要么把'456jk,56h,123ed'按逗号分割分别匹配,要么试试^[0-9]{1,3}[^\da-zA-Z]*[a-zA-Z]{1,2}$



好像还是不能匹配哦~

>>> s='456jk,56h,123ed'

>>> re.search('^[0-9]{1,3}[^\da-zA-Z]*[a-zA-Z]{1,2}$',s).group()
Traceback (most recent call last):
  File "<pyshell#32>", line 1, in <module>
    re.search('^[0-9]{1,3}[^\da-zA-Z]*[a-zA-Z]{1,2}$',s).group()
AttributeError: 'NoneType' object has no attribute 'group'
>>>

论坛徽章:
0
4 [报告]
发表于 2009-06-22 11:23 |只看该作者

回复 #1 Heaice 的帖子

如果要匹配 s = "456jk,56h,123ed"  这条字符串的话应该是:
text = "456jk,56h,123ed"
testPattern = re.search("^(\d{0,3})([a-zA-Z]{0,2})\D(\d{0,3})([a-zA-Z]{0,2})\D(\d{0,3})([a-zA-Z]{0,2})$",text)
print testPattern.group()  
你试试
像你那样写只能匹配一次 类似于  "456jk"的字符串,因为 $是匹配结束,而且","是特殊字符
如果要匹配"456jk,56h,123ed"这种格式的字符串得像上面那样写,当然只是一种写法而已,如果你只是想匹配"456jk"这样的话可以把text拆成列表再来匹配,像2楼说的那样,split一下就可以了。

论坛徽章:
0
5 [报告]
发表于 2009-06-22 11:39 |只看该作者
原帖由 thsniperwolf 于 2009-6-22 11:23 发表
如果要匹配 s = "456jk,56h,123ed"  这条字符串的话应该是:
text = "456jk,56h,123ed"
testPattern = re.search("^(\d{0,3})([a-zA-Z]{0,2})\D(\d{0,3})([a-zA-Z]{0,2})\D(\d{0,3})([a-zA-Z]{0,2})$",text)
...



嗯,也许我没说明白啊~导致大家在理解上的错误。

其实是想匹配s = "456jk,56h,123ed" 里面的'456jk'或者'56h'或者'123ed',而不是s整个字符串啊~

论坛徽章:
0
6 [报告]
发表于 2009-06-22 13:52 |只看该作者

回复 #5 Heaice 的帖子

那这样可以看到结果了:
textList = "456jk,56h,123ed"
for testPattern in [re.search(r"(\d{0,3})([a-zA-Z]{0,2})",text) for text in textList.split(",")]:
    print testPattern.group()

论坛徽章:
0
7 [报告]
发表于 2009-06-22 14:21 |只看该作者
请看下一帖

[ 本帖最后由 fzlqq 于 2009-6-22 14:45 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2009-06-22 14:29 |只看该作者
re.search('^\d{1,3}[0-9a-zA-Z|,]*[a-zA-Z]{1,2}$','11,11efd').group()

[ 本帖最后由 fzlqq 于 2009-6-22 14:48 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2009-06-22 15:56 |只看该作者
原帖由 fzlqq 于 2009-6-22 14:29 发表
re.search('^\d{1,3}[0-9a-zA-Z|,]*[a-zA-Z]{1,2}$','11,11efd').group()


你这个也是匹配整个字符串的~

多谢大家努力帮忙,不过呢,还是没有达到我的要求,应该是我描述有问题的吧~

就这么说吧~字符串为s = "456jk,56h,123ed"

需要用正则表达式完成匹配匹配整个字符串中的'456jk'  或者 '56h'  或者'123ed',这三个中的任意一个

或者用findall把符合的所有的全部挑出来也成。先分割在匹配我也考虑过,但是,因为分割符号不固定,所以也不太合适

论坛徽章:
0
10 [报告]
发表于 2009-06-23 11:02 |只看该作者

回复 #9 Heaice 的帖子

试试这样:
text = "456er=56h=123egr"
testPattern = re.search("^([0-9a-zA-Z]*)\D([0-9a-zA-Z]*)\D([0-9a-zA-Z]*)$",text)
print testPattern.groups() #逐个显示每个匹配字符或者用group(1,2,3),group(1),group(2),group(3)都可以,反正是列    表里面的东西
print testPattern.group() #显示整条字符串

不用考虑分隔符的问题了,当然得有点异常处理或者原始字符串判断的一些工作,具体得看你要处理什么了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP