0

我只想匹配代表数字之间的字符串0...9999

import re
NUMERIC  = re.compile("\d{,4}")
NUMERIC.match("324234")
nr =NUMERIC.match("324234")
nr.group(0)

尝试了上述方法,但它匹配字符串中的前 4 位数字,即使字符串有 5 位数字。

正则表达式匹配此字符串表示的整数中具有 1 到 4 位数字的数字?

4

2 回答 2

3

Anchors 可以做到不匹配太多:

>>> pattern = re.compile("^\d{1,4}$")
>>> pattern.match("0").group()
'0'
>>> pattern.match("42").group()
'42'
>>> pattern.match("777").group()
'777'
>>> pattern.match("2012").group()
'2012'
>>> pattern.match("65535").group()
------------------------------------------------------------
Traceback (most recent call last):
  File "<ipython console>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'

注意{1,4}-- 我假设你不想匹配空字符串。但是,这将匹配00001,这肯定在范围内。

一个更强大的正则表达式替代方案是利用 Python 的内置整数解析:

def parse_4digit_number(s):
    i = int(s)
    if 0 <= i <= 9999:
        return i
    else:
        raise ValueError("{0} is out of range".format(i))
于 2012-09-27T15:40:32.933 回答
2

^ 是行首 $ 是行尾

你可能想要单词......而不是整行......所以

\< = start of word 
\> = end of word
\b is word boundry...

许多语言不支持 \< 和 >...

所以

\b(\d{1,4})\b

但是,这将匹配 22.33 作为两个单独的匹配项。

你可以通过做这样的事情来避免这种情况。

(?:^|\s)(\d{1,4})(?:\s|$)

然而那会错过

super duper 3333,and 

因此,您必须在尾随字符列表中添加“,”或其他标点符号...

(?:^|\s)(\d{1,4})(?:\s|$|[,:;?])

然而,这让我们回到...

有5个人。今天...

5 将被错过!您如何区分这与“有 55.55% 的人”之间的区别

于 2012-09-27T11:23:04.050 回答