表現は:「価格(コンマを含むかもしれません)EG」
例:
40 EG
また
4,657 EG
また
4,352,345 EG
これらすべてのケースに使用する必要がある 1 つの文字列正規表現が必要です。
これを試すことができます:
^\d{1,3}(,\d{3})*\sEG$
小数も必要な場合は...
^\d{1,3}(,\d{3})*(\.\d\d?)?\sEG$
ここで、コンマをまったく使用せず、10 進数を使用できる数字 (999 以上) を使用できる場合...
^\d{1,3}(,?\d{3})*(\.\d\d?)?\sEG$
詳細:
^
at the start は、価格が次の文字で始まる必要があることを意味します (ここ\d
では数字を意味します)
\d{1,3}
1 ~ 3 文字の数字を意味します。
(,\d{3})*
カンマと数字 3 文字からなる 0 回以上出現するグループです。得られる価格が「クリーン」であると仮定すると、次のような,34
価格のようなもの3,34 EG
は通過できません。
(\.\d\d?)?
は別のグループで、0 回または 1 回出現し、ピリオド.
、数字、および 2 番目の可能な数字で構成されます。.2
またはのようなもの.54
は許可されています。.564
ただし、そうではありません。
\s
は 1 つの空白文字を意味し、それ以上でもそれ以下でもありません。提供された価格データが「クリーン」である場合、問題はなく、実際に「クリーン」でないものを特定するのに役立ちます。
EG
単純に通貨に一致しますEG
。
$
は、先行する文字 (G
この場合) が最後の文字でなければならないことを意味します。
次の正規表現を使用できます。
"([0-9]{1,3}(,[0-9]{3})*)\s+EG"
番号にコンマを含めることができない場合、たとえば123456
. この代替手段を使用できます:
"([0-9]+|[0-9]{1,3}(,[0-9]{3})*)\s+EG"
どうぞ:/(?:\d,?)+\sEG/
これは、これらの価格文字列のいずれにも一致します。
編集:これは私が今考えることができる最も包括的なものです。
[^\.,\d](?:\d+|\d{1,3}(?:,\d{3})*)(?:\.\d{2})?\s*EG
これは一致します:
123,123,123EG
234,123.23 EG
234123 EG
234123.52 EG
そして一致しません:
,,,,, EG
1,2,3,4,5,6 EG
1234,123 EG
234,1234 EG
([0-9]{1,3}(?:\,[0-9]{3})*|(?:[0-9]+))(?:\.([0-9]{2}))?(?=\s{1,}EG)
以下の作品
import re
t = ["40 EG",
"4,657 EG",
"4,352,345 EG",
",,,,,, EG",
"1,2,3,4 EG",
"12345 EG"]
regex = "[\d{1,3},]+\d{3}\sEG|^\d+\sEG"
for string in t:
print re.findall(regex, string)
出力:
['40 EG']
['4,657 EG']
['4,352,345 EG']
[]
[]
['12345 EG']
編集:要件を正確に満たすように更新しました。上記を参照してください
import re, pprint
strings = ['40 EG', '4,657 EG', '1234 EG', '6,78 EG', '4,352,345 EG', '1,234']
csn = re.compile('\d{1,3}(,\d{3})* EG')
pprint.pprint( [(s, bool(csn.match(s))) for s in strings] )
[('40 EG', True),
('4,657 EG', True),
('1234 EG', False),
('6,78 EG', False),
('4,352,345 EG', True),
('1,234', False)]