这对某人来说真的很快......
这是我的字符串:
Jan 13.BIGGS.04222 ABC DMP 15
我想要匹配:
这是我到目前为止所做的:
(\w{3} \d{2})\.(\w*)\..*(\d{1,3})$
通过大量玩http://www.pythonregex.com/我可以匹配'5',但不是'15'。
我做错了什么?
答案 0 :(得分:6)
使用.*?
非贪婪地匹配.*
:
In [9]: re.search(r'(\w{3} \d{2})\.(\w*)\..*?(\d{1,3})$', text).groups()
Out[9]: ('Jan 13', 'BIGGS', '15')
如果没有问号,.*
会匹配尽可能多的字符,包括您要与\d{1,3}
匹配的数字。
答案 1 :(得分:2)
除了@unutbu提议的内容,您还可以使用单词边界\b
- 这与“单词边框”匹配:
(\w{3} \d{2})\.(\w*)\..*\b(\d{1,3})$
从您提到的网站:
>>> regex = re.compile("(\w{3} \d{2})\.(\w*)\..*\b(\d{1,3})$")
>>> regex.findall('Jan 13.BIGGS.04222 ABC DMP 15')
[(u'Jan 13', u'BIGGS', u'15')]
答案 2 :(得分:1)
.*
在数字贪婪并尽可能匹配之前,将最少的数字留给最后一个数据块。你需要让它变得非贪婪(?
就像unutbu所说的那样)或者使它与数字不匹配,用.
替换\D