2017-04-02 5 views
0

3桁ごとにコンマで数字を照合する正規表現をどのように記述しますか?それは、 '42'、 '1,234'、および '6,368,745'と一致する必要があります。3桁ごとにコンマで数字を照合する正規表現

'12,34,567 '(コンマの間に2桁しかない)、' 1234 '(コンマがない)。

私はこの質問が以前に尋ねられ、答えられていることを知っていますが、正規表現に渡された文字列がそれらの数字の1つであったソリューションのためだけでした。正規表現に文字列 '42 1,234 6,368,745 12,34,567 1234'が渡された場合、それを行う最良の方法は何ですか?

は、私が最初の文字列を分割して、以下のようにそれをループでそれを行うために管理:そのコードを書くのより効率的な方法があるかどう

regexsplit = re.compile(r'^\d{1,3}(,\d{3})*$') 
splitstring = string.split() 
matches = [] 

for num in splitstring: 
    if regexsplit.search(num) is not None: 
     matches.append(regexsplit.search(num).group()) 

print matches 

まず、私は思ったんだけど。第2に、文字列を分割せずに.findall()メソッドを使用する方法があるのだろうかと思います。しかし、私は明らかにまだ12「」、'34、567' 取得しています

regexnosplit = re.compile(r'(\d{1,3}(,\d{3})*)') 
matches2 = [] 

for groups in regexnosplit.findall(string): 
    print groups[0] 

:私はあなたがもはや始まりと終わりを固定する^と$を使用することはできないと思いますので、私がやった知っています、 '123'、 '4'が返されたので、より堅牢な正規表現を渡す必要があると推測していますが、解決策を見つけることができません。私は、不要なパターンを見つけようと、このようにそれを行うだろう

+0

を説明 - ワード境界に見て否定的な先読み。 – jonrsharpe

答えて

0

import re 

s = '42 1,234 6,368,745 12,34,567 1234' 

rgx = re.compile(',[0-9]{1,2},|[0-9]{4,}') 
nums = [x for x in s.split() if not rgx.search(x)] 

print nums # ['42', '1,234', '6,368,745'] 
0

あなたが空白の境界のちょうど適切に一致させるために使用することができます

^((?:\d{1,3},(?:\d{3},)*\d{3})|(?:\d{1,3}))$ 

Demo and explanation

+0

これはどの形式であるか分かりませんが、C++では機能しません – thang

+0

PCREです。複数のC++ re libsがあります。あなたは使っていますか? – dawg

+0

Python、Perl、Go、Javascriptなどで動作します。 – dawg

0

を使用することができます
千単位のカンマ番号です。

(?<!\S)\d{1,3}(?:,\d{3})*(?!\S)

はあなたが試合は数の終わりで終了することを確認する必要があり

(?<! \S)   # Whitespace boundary 
\d{1,3}    # Required 1-3 digits 
(?: , \d{3})*  # Optional comma + 3 digits, 0 to many times 
(?! \S)    # Whitespace boundary 

テスト対象42 1,234 6,368,745 12,34,567 1234

出力

** Grp 0 - (pos 0 , len 2) 
42 

** Grp 0 - (pos 3 , len 5) 
1,234 

** Grp 0 - (pos 9 , len 9) 
6,368,745 
関連する問題