間の数字を表す文字列のみを一致させたい0...9999
import re
NUMERIC = re.compile("\d{,4}")
NUMERIC.match("324234")
nr =NUMERIC.match("324234")
nr.group(0)
上記を試してみましたが、文字列が5桁であっても、文字列の最初の4桁と一致します。
整数のこの文字列表現から 1 ~ 4 桁の数字と一致する正規表現は?
アンカーは、あまり一致しないというトリックを行います。
>>> 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))
^ は行頭 $ は行末
あなたはおそらく単語を望んでいます...行全体ではありません...だから
\< = 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%の人がいた」の違いをどう見分けますか?