有人可以解释一下钱正则表达式只是检查值是否与某些模式匹配?

oro*_*aki 6 python regex currency

这里有多个帖子可以捕获价值,但我只是想查看价值是否有所作为.更模糊地说; 我想了解检查值和"捕获"值之间的区别.在目前的情况下,价值将是以下可接受的货币格式:

这是一篇文章,解释了一些钱正则表达式,但我不太了解它.

.50
50
50.00
50.0
$5000.00
$.50
Run Code Online (Sandbox Code Playgroud)

我不想要逗号(人们应该知道这很荒谬).

我遇到麻烦的是:

  1. 在值的开头允许$(但仍然是可选的)
  2. 仅允许1个小数点(但最后不允许)
  3. 了解它是如何在内部工作的
  4. 同时了解如何获取标准化版本(仅限数字和可选的小数点),剥离美元符号.

我目前的正则表达式(显然不能正常工作)是:

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


Mar*_*ers 7

这是你可以使用的正则表达式:

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)