如何为价格表达式编写正则表达式?

时间:2013-05-14 11:11:28

标签: python regex

表达式是:“价格(可能包含逗号)EG”

示例:

40 EG

OR

4,657 EG

OR

4,352,345 EG

我想要一个字符串正则表达式,我应该用于所有这些情况。

6 个答案:

答案 0 :(得分:3)

你可以尝试这个:

^\d{1,3}(,\d{3})*\sEG$

如果你想要小数......

^\d{1,3}(,\d{3})*(\.\d\d?)?\sEG$

现在,如果你的数字(超过999)可以没有逗号而且可能有小数......

^\d{1,3}(,?\d{3})*(\.\d\d?)?\sEG$

更多详情:

开始时

^表示价格必须以下一个字符开头(此处\d表示数字字符)

\d{1,3}表示1到3个数字字符。

(,\d{3})*是一个组,出现0次或更多次,由逗号和3个数字字符组成。假设您获得的价格是“干净的”,那么价格为,34的{​​{1}}之类的内容将不会被允许通过。

3,34 EG是另一组,出现0或1次,由句点(\.\d\d?)?,数字和第二个可能的数字组成。允许使用..2之类的内容。但是.54不是。

.564表示一个空格字符,不多也不少。如果给出的价格数据是“干净的”,那么应该没有问题,实际上可以帮助您识别那些不“干净”的价格数据。

\s只匹配货币EG

EG表示前面的字符(在这种情况下为$)必须是最后一个字符。

答案 1 :(得分:2)

您可以使用此正则表达式:

"([0-9]{1,3}(,[0-9]{3})*)\s+EG"

如果您的号码不能包含逗号,例如123456。你可以使用这个替代方案:

"([0-9]+|[0-9]{1,3}(,[0-9]{3})*)\s+EG"

答案 2 :(得分:1)

在这里:/(?:\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

答案 3 :(得分:1)

以下作品

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']

编辑:已完全更新以满足要求,请参阅上文

答案 4 :(得分:1)

([0-9]{1,3}(?:\,[0-9]{3})*|(?:[0-9]+))(?:\.([0-9]{2}))?(?=\s{1,}EG)

enter image description here

enter image description here

答案 5 :(得分:0)

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)]