表达式为:“价格(可能包含逗号)EG”
例子:
40 EG
或者
4,657 EG
或者
4,352,345 EG
我想要一个应该用于所有这些情况的字符串正则表达式。
你可以试试这个:
^\d{1,3}(,\d{3})*\sEG$
如果你也想要小数...
^\d{1,3}(,\d{3})*(\.\d\d?)?\sEG$
现在,如果你可以有没有逗号的数字(超过 999 个)并且可能有小数......
^\d{1,3}(,?\d{3})*(\.\d\d?)?\sEG$
更多细节:
^
at the start 表示价格必须从下一个字符开始(这里\d
表示数字字符)
\d{1,3}
表示 1 到 3 个数字字符。
(,\d{3})*
是一个组,出现 0 次或多次,由一个逗号和 3 个数字字符组成。假设你得到的价格是“干净的”,,34
那么价格之类的东西3,34 EG
就不会被允许通过。
(\.\d\d?)?
是另一组,出现 0 次或 1 次,由句点.
、数字和第二个可能的数字组成。.2
诸如或之类的事情.54
是允许的。.564
然而,不是。
\s
表示一个空格字符,不多也不少。如果您获得的价格数据是“干净的”,那么应该没有问题,并且实际上会帮助您识别那些不“干净”的价格数据。
EG
简单地匹配货币EG
。
$
意味着前面的字符(G
在这种情况下)必须是最后一个。
您可以使用此正则表达式:
"([0-9]{1,3}(,[0-9]{3})*)\s+EG"
如果您的号码不能有逗号,例如123456
. 您可以使用此替代方法:
"([0-9]+|[0-9]{1,3}(,[0-9]{3})*)\s+EG"
([0-9]{1,3}(?:\,[0-9]{3})*|(?:[0-9]+))(?:\.([0-9]{2}))?(?=\s{1,}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
以下作品
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)]