Python 如何为价格表达式编写正则表达式?
表达式是:“价格(可能包含逗号)例如” 示例:Python 如何为价格表达式编写正则表达式?,python,regex,Python,Regex,表达式是:“价格(可能包含逗号)例如” 示例: 40 EG 或 或 我想要一个字符串regex,我应该用于所有这些情况。给你:/(?:\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,
40 EG
或
或
我想要一个字符串regex,我应该用于所有这些情况。给你:/(?:\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})*)\s+EG"
如果您的号码不能有逗号,例如123456
。您可以使用以下替代方法:
"([0-9]+|[0-9]{1,3}(,[0-9]{3})*)\s+EG"
你可以试试这个:
^\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
这样的价格,如3,34 EG
将不被允许通过
(\.\d\d?)
是另一组,出现0或1次,由句点
、一个数字和第二个可能的数字组成。像.2
或.54
这样的事情是允许的<但是,code>.564不是
\s
表示一个空格字符,不能多也不能少。如果提供给您的价格数据是“干净”的,那么应该没有问题,并且实际上会帮助您识别那些不“干净”的
EG
只是匹配货币EG
$
意味着前面的字符(G
在本例中)必须是最后一个字符。以下操作有效
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']
编辑:已更新以完全满足要求,请参见上文([0-9]{1,3}(?:\,[0-9]{3})*|(?:[0-9]+)(?:\([0-9]{2}))?(?=\s{1,}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)]
但这也将匹配1,2,3,4。当然,它也将匹配1234,例如,OP说它“可能”包含逗号。除非有特定的原因只需要
/\d{1,3}(,\d{3})*\sEG/
(不匹配1234 EG)格式的值,否则我将使用上面的答案。这也将匹配,,,,,EG
,这是OP想要的吗?您的答案将匹配“1,2,3,4 EG”Expression已更改正则表达式以停止@JackAidley的case更新以完全符合要求两个小问题:我将使用\s+
以防万一,以及一些合理的限制,如{0,5}
而不是*
-他们肯定不希望这与数百万英镑匹配。@thg435感谢您的评论。你说得对,我编辑是为了使用\s+。这是有效的输入:12345 EG
?那么1,234567444,5 EG
?您的第三个示例^\d{1,3}(,?\d{3})*(\.\d\d?)\sEG$
将与100000000
@jvallver匹配,这就是目的:如果逗号不总是“在那里”。我不知道实际值有多混乱,但假设一个干净的值,我会选择第1个或第2个regexp。第三个给了可能的逗号“混乱”一些自由。好的,但我认为最好你必须选择是否用逗号或不带任何逗号格式化价格。4+数字和逗号的混合有点奇怪。@jvallver是的,我也是,这就是为什么它不是我的第一个或第二个选择:)我后来想了一下,但OP还没有确认任何事情,所以我添加了它,以防^^^也没有给出正则表达式的用途;是只接受这些数字,以便识别不符合模式的数字,还是模式仅用于在以后的阶段使用数字,只要这些数字可用?所以=/
['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)]