Python 为什么我的正则表达式不匹配下面的数字字符串?
如果我在1700万美元上使用money_conversion func,它会返回17000000等,只有当它是一个数字时,它才会返回不正确的匹配,即700万美元转换为7,而不是7000000美元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
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]乘以该数字