Python正则表达式 - 不匹配字符串末尾的数字

时间:2013-09-03 10:23:38

标签: python regex expression

这对某人来说真的很快......

这是我的字符串:

  

Jan 13.BIGGS.04222 ABC DMP 15

我想要匹配:

  1. 前面的日期(mmm yy)格式
  2. 第二个字段中的名称
  3. 最后的数字。可能有一到三个。
  4. 这是我到目前为止所做的:

    (\w{3} \d{2})\.(\w*)\..*(\d{1,3})$
    

    通过大量玩http://www.pythonregex.com/我可以匹配'5',但不是'15'。

    我做错了什么?

3 个答案:

答案 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