oro*_*aki 6 python regex currency
这里有多个帖子可以捕获价值,但我只是想查看价值是否有所作为.更模糊地说; 我想了解检查值和"捕获"值之间的区别.在目前的情况下,价值将是以下可接受的货币格式:
这是一篇文章,解释了一些钱正则表达式,但我不太了解它.
.50
50
50.00
50.0
$5000.00
$.50
Run Code Online (Sandbox Code Playgroud)
我不想要逗号(人们应该知道这很荒谬).
我遇到麻烦的是:
我目前的正则表达式(显然不能正常工作)是:
# I'm checking the Boolean of the following:
re.compile(r'^[\$][\d\.]$').search(value)
Run Code Online (Sandbox Code Playgroud)
(注意:我在使用Python)
Gre*_*con 15
假设您想要允许$5.
但不允许5.
,以下内容将接受您的语言:
money = re.compile('|'.join([
r'^\$?(\d*\.\d{1,2})$', # e.g., $.50, .50, $1.50, $.5, .5
r'^\$?(\d+)$', # e.g., $500, $5, 500, 5
r'^\$(\d+\.?)$', # e.g., $5.
]))
Run Code Online (Sandbox Code Playgroud)
要了解的重要部分:
^
并且分别$
仅在输入字符串的开头和结尾处匹配.\.
匹配文字点\$
匹配一个字面的美元符号
\$?
一个美元符号或没有(匹配即,一个可选的美元符号)\d
匹配任何一位数(0-9)
\d*
匹配零个或多个数字的运行\d+
匹配一个或多个数字的运行\d{1,2}
匹配任何单个数字或两个数字的运行带括号的子模式是捕获组:输入中与捕获组中的子表达匹配的所有文本都将可用matchobj.group(index)
.美元符号不会被捕获,因为它在括号之外.
由于Python不支持多个捕获组具有相同的名称(!),我们必须通过搜索matchobj.groups()
的一个不是None
.这也意味着在修改模式时必须小心,(?:...)
除了金额之外的每个组都要使用.
我们得到了调整Mark的不错的测试工具
for test, expected in tests:
result = money.match(test)
is_match = result is not None
if is_match == expected:
status = 'OK'
if result:
amt = [x for x in result.groups() if x is not None].pop()
status += ' (%s)' % amt
else:
status = 'Fail'
print test + '\t' + status
Run Code Online (Sandbox Code Playgroud)
输出:
.50 OK (.50) 50 OK (50) 50.00 OK (50.00) 50.0 OK (50.0) $5000 OK (5000) $.50 OK (.50) $5. OK (5.) 5. OK $5.000 OK 5000$ OK $5.00$ OK $-5.00 OK $5,00 OK OK $ OK . OK .5 OK (.5)
这是你可以使用的正则表达式:
regex = re.compile(r'^\$?(\d*(\d\.?|\.\d{1,2}))$')
Run Code Online (Sandbox Code Playgroud)
这是我用来测试它的试验台.我已经包括了你所有的测试,还有我自己的测试.我还包括了一些负面测试,因为确保它不匹配时它不应该与确保它应该匹配时一样重要.
tests = [
('.50', True),
('50', True),
('50.00', True),
('50.0', True),
('$5000', True),
('$.50', True),
('$5.', True),
('$5.000', False),
('5000$', False),
('$5.00$', False),
('$-5.00', False),
('$5,00', False),
('', False),
('$', False),
('.', False),
]
import re
regex = re.compile(r'^\$?(\d*(\d\.?|\.\d{1,2}))$')
for test, expected in tests:
result = regex.match(test)
is_match = result is not None
print test + '\t' + ('OK' if is_match == expected else 'Fail')
Run Code Online (Sandbox Code Playgroud)
要获得不带$的值,您可以使用捕获的组:
print result.group(1)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11467 次 |
最近记录: |