求解一个python正则表达式问题

爱在疯起时 2012-05-15 01:55:42
import re
cr = re.compile("怎么写呢")
s = "abcd123d123ad1v123"
print cr.findall(s)

我想找出以a开头,以123字符串结尾,但是中间不出现123这个字符串的字符串。
比如上题,结果应为:abcd123和ad1v123。

请教大侠这个正则该如何写呢?
...全文
212 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
libralibra 2012-05-15
  • 打赏
  • 举报
回复
使用?!即可.不过python不知道怎么回事,如果正则表达式最外层不加括号,只返回内部的匹配组
是'','s'和''
加了(),会返回三组匹配,每组第一个元素就是你需要的

>>> import re
>>> s = 'a123abvpd123d“p”f12ab123sabd123f1123abc'
>>> res = r'(123((?:(?!123|“p”)[\s\S])*?)ab)'
>>> m = re.findall(res,s)
>>> result = [x[0] for x in m]
>>> print result
['123ab', '123sab', '123ab']
>>>
爱在疯起时 2012-05-15
  • 打赏
  • 举报
回复
谢谢,楼上两位,尤其是libralibra。

以上问题解决了,还有一个相反问题:
import re
cr = re.compile("怎么写呢")
s = "a123abvpd123d“p”f12ab123sabd123f1123abc"
print cr.findall(s)

我想找出以123字符串开头,以ab字符串结尾,但是中间不出现123和“p”这两个字符串的子字符串。
比如上题,结果应为:123ab和123sab和123ab。

不好意思,分不多了。我先结贴了~
libralibra 2012-05-15
  • 打赏
  • 举报
回复
楼上的.+?无法匹配a123,不过楼主这个字符串中也没有这种情况
>>> s = 'abcd123d123ad1v123a123'
>>> print re.findall(r'a.*?123',s)
['abcd123', 'ad1v123', 'a123']
>>> print re.findall(r'a.+?123',s)
['abcd123', 'ad1v123']
>>>
tim_spac_126 2012-05-15
  • 打赏
  • 举报
回复
Python 2.7.2+ (default, Oct  4 2011, 20:03:08) 
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> s = "abcd123d123ad1v123"
>>> patt = re.compile(r'(a.+123)')
>>> print patt.findall(s)
['abcd123d123ad1v123']
>>> patt = re.compile(r'(a.+?123)')
>>> print patt.findall(s)
['abcd123', 'ad1v123']
>>>
libralibra 2012-05-15
  • 打赏
  • 举报
回复
加个?非贪婪匹配,找到第一个123就返回了,可以保证中间不出现123
>>> import re
>>> res = r'a.*?123'
>>> s = 'abcd123d123ad1v123'
>>> print re.findall(res,s)
['abcd123', 'ad1v123']
>>>

37,741

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧