0

間の数字を表す文字列のみを一致させたい0...9999

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

上記を試してみましたが、文字列が5桁であっても、文字列の最初の4桁と一致します。

整数のこの文字列表現から 1 ~ 4 桁の数字と一致する正規表現は?

4

2 に答える 2

3

アンカーは、あまり一致しないというトリックを行います。

>>> 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 は 2 つの別個の一致として一致します。

このようなことをすることでそれを避けることができます。

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

しかし、それは見逃すでしょう

super duper 3333,and 

そのため、末尾の文字のリストに「,」またはその他の句読点を追加する必要があります...

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

しかし、それは私たちを...

5番の人がいました。今日は…

5は見逃されるでしょう!それと「55.55%の人がいた」の違いをどう見分けますか?

于 2012-09-27T11:23:04.050 に答える