Python 为什么我的正则表达式不匹配下面的数字字符串?

Python 为什么我的正则表达式不匹配下面的数字字符串?,python,regex,Python,Regex,如果我在1700万美元上使用money_conversion func,它会返回17000000等,只有当它是一个数字时,它才会返回不正确的匹配,即700万美元转换为7,而不是7000000美元 import re number = r'\d+(,\d{3})*\.*\d*' #$790,000 amount = r'thousand|million|billion' #$12.2 million example word

如果我在1700万美元上使用money_conversion func,它会返回17000000等,只有当它是一个数字时,它才会返回不正确的匹配,即700万美元转换为7,而不是7000000美元

import re

number = r'\d+(,\d{3})*\.*\d*'                     #$790,000
amount = r'thousand|million|billion'                #$12.2 million example

word_re = rf'\${number}(-|\sto\s|–)?(\$*{number})\s?({amount})'
value_re = rf'\${number}'

def parse_word_syntax(string):
    value_string = re.search(number,string).group()
    value = float(value_string.replace(',',''))
    word = re.search(amount,string,flags=re.I).group().lower()
    word_value = word_to_value(word)
    return value * word_value

def word_to_value(word):
    value_dict ={'thousand':1000,'million':1000000,'billion':1000000000}
    return value_dict[word]

def parse_value_syntax(string):
    value_string = re.search(number,string).group()
    value = float(value_string.replace(',',''))
    return value

def money_conversion(money):
    if money == 'N/A':
        return None
    
    if isinstance(money,list):
        money = money[0]
        
    word_syntax = re.search(word_re,money,flags=re.I)
    value_syntax = re.search(value_re,money)
    
    if word_syntax:
        print('converting word object to numerics')
        return parse_word_syntax(word_syntax.group())
    
    elif value_syntax:
        print('converting float objects to numerics')
        return parse_value_syntax(value_syntax.group())
    
    else:
        return None
'''


原因很简单:您的正则表达式与看起来像
\$\d+(,\d{3})*\.*\d*(-\sto\s |-)(\$*\d+(,\d{3})*\.*\s(万亿)的
正则表达式不匹配,请参见。您试图使每个后续的模式部分成为可选的,但是您忘记了
number
变量块中的
\d+
至少需要匹配一个数字,并且由于
word\u re
包含两个
number
的匹配项,因此整个结果正则表达式至少需要两个数字

你需要使用

number=r'\d+(?:,\d{3})*(?:\。\d+?)
单词\u re=rf'\${number}(?:(?:-|\sto\s |-)\${number})?\s*({amount})

  • \$\d+(?:,\d{3})*(?:\.\d+)
    -匹配
    $
    ,一个或多个数字,然后是逗号和三位数块的零次或多次重复,然后是可选的
    和一个或多个数字
  • (?:(?:-|\sto\s |-)\$\d+(?:,\d{3})*(?:\。\d+)?
    -以下可选序列:
    • (?:-|\sto\s |–)
      -
      -
      ,空格+
      +空格,或
      -
    • \$
      -a
      $
      字符
    • \d+(?:,\d{3})*(?:\。\d+)
      -见上文
  • \s*
    -零个或多个空格
  • (千亿)
    -三个字符串之一

您为什么需要
re
在这里?您可以:(1)检查第一个字符是否为
$
,(2)parts=str.split by“”(3)将parts[1]转换为一个因子(百万、十亿等转换为数字),(4)将parts[0]乘以该数字