免费注册 查看新帖 |

Chinaunix

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

正则表达式的问题,求帮助!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-09-08 17:03 |只看该作者 |倒序浏览
>>>a
'ABC ABC ABC AAA ABC ABC BBB ABC ABC'
>>>re.findall(r'(ABC(.{3})*?AAA(.{3})*?[AB]B[BC])',a)
[('ABCABCABCAAAABC','ABC',' ')]

为什么得到的结果是 ABCABCABCAAAABC 而不是 ABCAAAABC ,要怎样才能得到 ABCAAAABC 这个结果?

论坛徽章:
5
巨蟹座
日期:2014-08-28 18:12:342015年迎新春徽章
日期:2015-03-04 10:01:4415-16赛季CBA联赛之江苏
日期:2016-04-28 09:43:3115-16赛季CBA联赛之吉林
日期:2016-06-22 10:34:4315-16赛季CBA联赛之山西
日期:2016-08-16 16:29:55
2 [报告]
发表于 2015-09-08 23:49 |只看该作者
本帖最后由 Linux_manne 于 2015-09-08 23:49 编辑

这样????:
(\w+\sAAA\s\w+)  

论坛徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白银圣斗士
日期:2015-11-17 15:13:0815-16赛季CBA联赛之新疆
日期:2016-04-01 09:10:58
3 [报告]
发表于 2015-09-09 08:57 |只看该作者
回复 1# qiushi19911025
因为你用来匹配的串是:
ABC(.{3})*?AAA[AB]B[BC], 在匹配过程中,是从左向右的,所以,当ABC和你的初始串的开始位置的ABC匹配之后,就试图匹配(.{3})*?,然后再试图匹配AAA。
所以,就会出现你现在描述的情况。
?的模式更多是用在这种情况下:
比如:(.{3})有可能会匹配到AAA的时候,通过?来保证后续的AAA不会被放到前面的匹配串里面去。

如果你的目的是确定匹配ABCAAA的话,你的匹配串可以改成:
ABCAAA[AB]B[BC]

论坛徽章:
0
4 [报告]
发表于 2015-09-09 09:54 |只看该作者
回复 2# Linux_manne
我的意思是ABC和AAA之间还有很多个其他字母,比如ABB ACC什么的,我向左匹配的时候怎么能匹配到第一个ABC就停止呢?而不是最前面那一个ABC。


   

论坛徽章:
0
5 [报告]
发表于 2015-09-09 09:55 |只看该作者
回复 3# icymirror


  我的意思是ABC和AAA之间还有很多个其他3字母,比如ABB ACC什么的,我向左匹配的时候怎么能匹配到第一个ABC就停止呢?而不是最前面那一个ABC。  

论坛徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白银圣斗士
日期:2015-11-17 15:13:0815-16赛季CBA联赛之新疆
日期:2016-04-01 09:10:58
6 [报告]
发表于 2015-09-09 11:46 |只看该作者
回复 5# qiushi19911025
如果是这个目的,那么你需要使用前向/后向非界定(简单说:就是前面/后面不要出现指定的字符串),这时,你的匹配串应当是:
'ABC(?<!ABC)*?AAA(?![AB]B[BC])*?[AB]B[BC]'
这个匹配的意思是:
ABC: 匹配ABC
(?<!ABC)*?: 前面不匹配ABC的最短串
AAA: 匹配AAA
(?![AB]B[BC])*?:后面不匹配ABB,ABC,BBB或者BBC的最短串
[AB]B[BC]:匹配ABB,ABC,BBB或者BBC

论坛徽章:
0
7 [报告]
发表于 2015-09-09 15:22 |只看该作者
回复 6# icymirror

谢谢你啊,我的意思是我已经知道一串序列的前、中、后了,怎样得到前中和中后这两段,并且要求这两段是最短的,中间的字符个数是三的倍数。就如我举的例子:

    a="ABB ABC ACC ABC ACC ACC ABC BBB AAA CCC CBA CCA BBC BBA ABC BBC ACC ABB"

我已经知道这条序列的前面是ABC,中间是AAA,后面是BBC。我怎么从a中的到ABC(。。。)AAA(。。。)BBC是最短的即ABC BBB AAA CCC CBA CCA BBC,而不是ABC ACC ACC ABC BBB AAA CCC CBA CCA BBC 或 ABC ACC ACC ABC BBB AAA CCC

CBA CCA BBC等。

论坛徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白银圣斗士
日期:2015-11-17 15:13:0815-16赛季CBA联赛之新疆
日期:2016-04-01 09:10:58
8 [报告]
发表于 2015-09-09 16:50 |只看该作者
回复 7# qiushi19911025
正则不是万能的,要求比较复杂的,建议上代码实现。

论坛徽章:
0
9 [报告]
发表于 2015-09-09 17:07 |只看该作者
回复 8# icymirror


    哦,谢谢。代码效率太低了,所以想用正则,就是整不出来。还是谢谢你啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP