2

对于某人来说,这将是非常快速的标记...

这是我的字符串:

1 月 13.BIGGS.04222 ABC DMP 15

我正在寻找匹配:

  1. 前面的日期 (mmm yy) 格式
  2. 第二个字段中的名称
  3. 最后的数字。可能在一到三个之间。

这是我到目前为止所拥有的:

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

通过大量使用http://www.pythonregex.com/我可以匹配“5”,但不能匹配“15”。

我究竟做错了什么?

4

3 回答 3

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}

于 2013-09-03T10:26:42.143 回答
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')]
于 2013-09-03T10:32:10.723 回答
1

.*在数字贪婪并尽可能多地匹配之前,将尽可能少的数字留给最后一个块。您要么需要使其不贪婪(?就像 unutbu 所说的那样),要么使其与数字不匹配,替换.\D

于 2013-09-03T10:29:34.563 回答