Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何为价格表达式编写正则表达式?_Python_Regex - Fatal编程技术网

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