对于某人来说,这将是非常快速的标记...
这是我的字符串:
1 月 13.BIGGS.04222 ABC DMP 15
我正在寻找匹配:
- 前面的日期 (mmm yy) 格式
- 第二个字段中的名称
- 最后的数字。可能在一到三个之间。
这是我到目前为止所拥有的:
(\w{3} \d{2})\.(\w*)\..*(\d{1,3})$
通过大量使用http://www.pythonregex.com/我可以匹配“5”,但不能匹配“15”。
我究竟做错了什么?
对于某人来说,这将是非常快速的标记...
这是我的字符串:
1 月 13.BIGGS.04222 ABC DMP 15
我正在寻找匹配:
这是我到目前为止所拥有的:
(\w{3} \d{2})\.(\w*)\..*(\d{1,3})$
通过大量使用http://www.pythonregex.com/我可以匹配“5”,但不能匹配“15”。
我究竟做错了什么?
用于非贪婪.*?
匹配:.*
In [9]: re.search(r'(\w{3} \d{2})\.(\w*)\..*?(\d{1,3})$', text).groups()
Out[9]: ('Jan 13', 'BIGGS', '15')
没有问号,.*
匹配尽可能多的字符,包括你想匹配的数字\d{1,3}
。
除了@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')]
.*
在数字贪婪并尽可能多地匹配之前,将尽可能少的数字留给最后一个块。您要么需要使其不贪婪(?
就像 unutbu 所说的那样),要么使其与数字不匹配,替换.
为\D