如何创建美元货币的正则表达式?

时间:2019-06-17 08:49:58

标签: python regex

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

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

我该怎么做?

4 个答案:

答案 0 :(得分:1)

可能最简单的方法是创建多个选择:

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

在此处查看实际操作:https://regex101.com/r/sAiDOo/2

这是微不足道的方法,但效果很好。根据您的使用情况,可能不需要使用括号。

说明:

我们有4个单独的选项,所有选项都由|(竖线)分隔。

  1. \$\s*\d+:搜索一个美元符号(记住要转义!),后跟任意数量的空格(*:0或更多),然后至少一个数字({{1 }}:1个或更多)
  2. +:同样,反之亦然:搜索至少一位数字,后跟任意数量的空格,后跟一个美元符号。
  3. \d+\s*\$:搜索至少一个数字,然后至少搜索一个空格,然后再搜索单词。
  4. \d+\s+dollars:搜索确切的字符串1 dollar,因为1 dollar(复数s)将不匹配它。

答案 1 :(得分:1)

您可以使用

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 demo online。输出:

['$ 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)

请参见this regex demo。详细信息:

  • \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)-不带空格的单词边界。

答案 2 :(得分:0)

使用您的轮换方式的另一个选择可能是:

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

说明

  • (?:非捕获组
    • \$\s*\d+匹配一个美元符号,0 +倍空白字符和1+个数字
    • |
    • \d+\s*匹配1+个数字,后跟0+个空格字符
    • (?:非捕获组
      • \$?usd|\$|dollars?|bucks匹配其中\$?是可选美元符号的任何选项
    • )关闭非捕获组
  • )关闭非捕获组

Regex demo

答案 3 :(得分:0)

我同意@christoph 但可以通过其他方式思考来缩短它

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

查看实际效果-https://regex101.com/r/IWnHni/1

说明

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

希望这会有所帮助