只要字符串Incorrect_Price保持您在示例中呈现的结构(数字不是用文字表示的),任务就可以相对容易地解决。在
使用正则表达式,您可以使用similar SO question中的方法提取数字部分和可选的“cent”/“cents”或“dollar”/“dollars”。两个主要的区别是,你要找的是数值和“美分”或“美元”对,而且它们可能不止一次出现。在import re
def extract_number_currency(value):
prices = re.findall('(?P[\d]*[.]?[\d]{1,2})\s*(?Pcent|dollar)s?', value)
result = 0.0
for value, currency in prices:
partial = float(value)
if currency == 'cent':
result += partial / 100
else:
result += partial
return result
print(extract_number_currency('3 dollars and 49 cent'))3.49
现在,您需要将此函数应用于列中所有不正确的值,其中的价格为文字。为了简单起见,我在这里将其应用于所有值(但我相信您将能够处理子集):
^{pr2}$
喂!在
正则表达式的分解'(?P[\d]*[.]?[\d]{1,2})\s*(?Pcent|dollar)s?'
有两个捕获命名为组(?P .... )
第一个捕获组(?P[\d]*[.]?[\d]{1,2})捕获:
[\d]-数字
[\d]*-重复0次或更多次
[.]?-后跟可选(?)点
[\d]{1,2}-后跟一个重复1到2次的数字
\s*-表示0个或更多空白
现在第二个捕捉组要简单得多:(?Pcent|dollar)
cent|dollar-它归结为要捕获的cent和dollar字符串之间的选择
s?是“cents”或“dollars”的可选复数形式