如何为美元货币添加正则表达式



我想为美元货币创建一个正则表达式。这个例子应该通过正则表达式找到:

$ 10 
10$
10 $
1000005 dollars

这不应该匹配:

dollars 33

我已经使用了这个表达式:

r_dollar = r'($|$usd|usd|dollar(s)?|bucks)'
number = '([1-9]([0-9])+)'
valuta_with_num = u'(({0})s?{1})|({1}s?({0}))'.format(number, r_dolar)
currency_tags = re.compile(u'({0})'.format(valuta_with_num))

我该怎么做?

使用您的替代的另一个选项可能是:

(?:$s*d+|d+s*(?:$?usd|$|dollars?|bucks))

解释

  • (?: 非捕获组
    • $s*d+ 匹配美元符号,0+ 乘以空格字符和 1+ 位数字
    • |
    • d+s*匹配 1+ 数字后跟 0+ 空格字符
    • (?: 非捕获组
      • $?usd|$|dollars?|bucks匹配$?为可选美元符号的任何选项
    • ) 关闭非捕获组
  • ) 关闭非捕获组

正则表达式演示

实现此目的的最简单方法可能是创建多个替代方案:

($s*d+|d+s*$|d+s+dollars|1 dollar)

在这里看到它的实际应用: https://regex101.com/r/sAiDOo/2

这是微不足道的方法,但它效果很好。根据您的使用案例,可能不需要换行括号。

解释:

我们有 4 个单独的选项可用,所有选项都由|(管道(隔开。

  1. $s*d+:搜索美元符号(记住要转义!(,后跟任意数量的空格(*:0或更多(,后跟至少一个数字(+:1或更多(
  2. d+s*$ :同样的事情,只是相反:搜索至少一个数字,后跟任意数量的空格,后跟一个美元符号。
  3. d+s+dollars:搜索至少一个数字,后跟至少一个空格,后跟单词美元。
  4. 1 dollar:搜索确切的字符串1 dollar,因为它不会与dollars(复数s(匹配。
您可以使用

import re
strs = ['Some $ 10 here', 
        'And 10$ here',
        'And 10 $  here',
        'And 1000005 dollars here',
        'And dollars one million and five here']
r_dollar = r'(?:$(?:usd)?|(?:dollar|buck)s?)' # USD dollar name
r_textnumber = r'b(?!s)(?:[sa-]|zero|one|tw(?:elve|enty|o)|th(?:irt(?:een|y)|ree)|fi(?:ft(?:een|y)|ve)|(?:four|six|seven|nine)(?:teen|ty)?|eight(?:een|y)?|ten|eleven|forty|hundred|thousand|[mb]illion|and)+b(?<!s)'
r_number = r'(?:[1-9][0-9]+|{})'.format(r_textnumber) # Dollar amount
valuta_with_num = r'{0}s?{1}|{1}s?{0}'.format(r_number, r_dollar) # Main regex
print(valuta_with_num)
currency_tags = re.compile(valuta_with_num)
for s in strs:
    print(currency_tags.findall(s))

在线观看 Python 演示。输出:

['$ 10']
['10$']
['10 $']
['1000005 dollars']
['dollars one million and five']

将数字匹配为单词的正则表达式部分是

b(?!s)(?:[sa-]|zero|one|tw(?:elve|enty|o)|th(irt(een|y)|ree)|fi(?:ft(?:een|y)|ve)|(?:four|six|seven|nine)(?:teen|ty)?|eight(?:een|y)?|ten|eleven|forty|hundred|thousand|[mb]illion|and)+b(?<!s)

请参阅此正则表达式演示。详:

  • b(?!s) - 不跟空格的单词边界
  • (?:s|[a-]|zero|one|tw(?:elve|enty|o)|th(irt(een|y)|ree)|fi(?:ft(?:een|y)|ve)|(?:four|six|seven|nine)(?:teen|ty)?|eight(?:een|y)?|ten|eleven|forty|hundred|thousand|[mb]illion|and)+ - 1次或多次重复空格,a-zero,...,nineteneleventwelve...,twentyhundredthousandmillionbillion
  • b(?<!s) - 前面没有空格的单词边界。

我同意@christoph但它可以通过反过来思考来缩短

^($|d+)(s*)(d+|dollar|dollars|$)$

看到它的实际效果 - https://regex101.com/r/IWnHni/1

解释

  1. 第一组(括号(告诉我们什么可以排在第一位,即 $ 或数字
  2. 第二组用于空间
  3. 第三组告诉我们空间之后会发生什么,即美元或美元或美元或数字

希望这有帮助

最新更新