Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.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/19.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,我想为美元货币创建一个正则表达式。 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) curre

我想为美元货币创建一个正则表达式。 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))

如何做到这一点?

实现这一点的最简单方法可能是创建多个备选方案:

(\$\s*\d+\d+\s*\$\d+\s+美元1美元)

请在此处查看它的实际操作:

这是一种简单的方法,但效果很好。根据您的用例,可能不需要包装括号

说明:

我们有4个单独的选项可用,全部由
|
(管道)分隔

  • \$\s*\d+
    :搜索美元符号(记住要将其转义!),后跟任意数量的空格(
    *
    :0或更多),后跟至少一个数字(
    +
    :1或更多)
  • \d+\s*\$
    :同样的事情,只是反过来:搜索至少一个数字,后跟任意数量的空格,后跟一个美元符号
  • \d+\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))
    
    将数字作为单词进行匹配的正则表达式部分是

    \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)(?:[\sa-]| 0 | 1 | tw(?:elve | enty | o)th(irt(een | y | ree)| fi(?:ft(?:een | y)| ve)|(?:四六|七|九|八|:een | y)|一万| |十四|万|百万|?
    见附件。详情:

    • \b(?!\s)
      -单词边界后面没有空格
    • (?:\s |[a-]| 0 | 1 | tw(?:elve | enty | o)th(irt(een | y | ree)fi(?:ft(?:een | y)ve)|(?:四|六|七|九)(青少年| y)八(een | y)|一万|十四|万|万|+
      -1个或多个空格重复,
      a
      -
      0
      ,…,
      9
      10
      11
      12
      20
      100
      000
      1000000
      1000000
    • \b(?-前面没有空格的单词边界

    使用您的备选方案的另一个选项可能是:

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

    • (?:
      非捕获组
      • \$\s*\d+
        匹配美元符号、0+乘以空格字符和1+位数
      • |
      • \d+\s*
        匹配1+个数字,后跟0+个空格字符
      • (?:
        非捕获组
        • \$?usd |$\$美元|美元
          匹配任何选项,其中
          \$?
          是可选的美元符号
      • 关闭非捕获组
    • 关闭非捕获组
    我同意@christoph的观点 但如果换个角度思考,它可以缩短

    ^(\$|\d+)(\s*)(\d+|dollar|dollars|\$)$
    
    看到它在行动-

    解释

  • 第一组(括号)告诉我们什么可以排在第一位,即$或数字
  • 第二组是空间
  • 第三组告诉我们空格后面可以是什么,即$或美元或美元或数字

  • 希望这有帮助

    根据OPs问题,
    一百万美元和五百万美元
    不应该是输出的一部分。或者至少这是我的理解。@Asunez我不理解OP也想提取这样的匹配项,但当前的正则表达式不这样做。我在问题的评论中要求澄清,这显然不是clear问题。@Asunez我检查了OP解决方案,它是第一个测试集,但与最后一个测试集不匹配。因此,我认为我的答案正是所需的。似乎是这样,但其他答案无效,因为它们不试图与最后一个测试集匹配。如果您将
    s
    美元设置为
    可选:)检查此项:是的,我支持你这项操作不正确,因为它也将匹配
    123
    。请澄清:你想不想捕获
    一百万美元和五百万美元?@Asunez,我不想捕获“一百万美元和五百万美元”。@DmitrySidenko但是。那有什么问题吗?你是否使用了
    re.findall
    r正则表达式并得到奇怪的结果?我想创建一个简短的正则表达式句子,它得到33美元和33美元,而不是33美元。在
    一百万美元和五美元的例子中使用是我的错。它将出现在下一个任务中,并且与当前问题没有联系。谢谢你@第四只鸟的回答。它通过了我所有的测试
    
    ^(\$|\d+)(\s*)(\d+|dollar|dollars|\$)$