题目:使用python正则表达式匹配文中所有的美元字样,并且将其转换成纯金额。
asdasfa$12342.492asgasg$231,999.00h$299124rher$345213
asdasfa$12342.492asgasg$231,999.00h$299124rher$979699
$231,999.00h$299124rherh5240.00美元$231,999.00$2893529
asdasfa$12342.492asgasg$231,999.00h$299124rher$039572
asdasfa$12342.492asgasg$231,999.00h$231,999.00#$02935
$231,999.00h$299124rherh5240.00美元$231,999.00$29037we
asdasfa$12342.492asgasg$231,999.00h$231,999.00$352396j
$231,999.00h$299124rherh5240.00美元$231,999.00$wr$2351
asdasfa$12342.492asgasg$231,999.00h$231,999.00$2352366
通过浏览可以发现,dollar.txt中的金额样式有
$12342.492
$231,999.00(带逗号的)
5240.00美元
$345213
import re
# 获取所有数据
text = ''
file = open(r"dollar.txt",encoding="UTF-8")
for line in file:
text = text + line
file.close()
# 通过正则表达式获取结果集
result = re.findall('(\$[\d+,]*\d+[\.\d+]*)|(\d+\.\d{2}美元)',text)
# 数据清洗
data = []
for r in result:
if r[0] != '':
data.append(r[0])
if r[1] != '':
data.append(r[1])
# 打印输出
print("{}{}".format("提取的数据:",data))
list_num = [] # 存储纯数字列表
for n in data:
list_num.append(re.findall('\d+',n)) # 将字符串除去
print(list_num)
result_num = [] # 存储最终结果
for i in list_num:
money = 0
digit = 0 # 用来表示位数,从个位开始
if len(i) == 1:
money = eval(i[0])
else:
decimal = eval(i[-1])/pow(10,len(i)) # 小数部分
money = decimal
li = list(reversed(i)) # 倒序排序
for j in range(1,len(li)):
money = money + eval(li[j])*pow(10,digit)
digit = digit + len(li[j])
result_num.append(money)
# 打印输出
print(result_num)
运行一下
OK!现在来讲解一下代码中的正则表达式:
result = re.findall(’($[\d+,]\d+[.\d+])|(\d+.\d{2}美元)’,text)
(\$[\d+,]*\d+[\.\d+]*)|(\d+\.\d{2}美元)
\$
:匹配一个“$”美元符号,\在这里是转义符;
[\d+,]:这可以看做是一个单独的语句
(1)[… …]:中括号,通俗地讲就是看做是一个整体表达式,做一个优先级运算;
(2)\d*:匹配一个数字;
(3)+:加号,匹配前面的子表达式一次或多次。\d+ 匹配一个或多个数字的组合;
(4),:逗号,在这里没什么含义,仅仅是为了匹配一个逗号;
*
:星号和 加号 作用类似,是为了匹配前面的子表达式零次或多次,例如 \d* ,就可以匹配空字符串或者多个数字的组合;
[.\d+]*:同理,这里补充一下,. 在这里也仅仅是为了匹配一个小数点;
(… …):括号,和中括号功能类似,也是看做是一个整体表达式,但是有一点不同的是,它的子表达式会获取供以后使用,就是说有多少个括号就会匹配多少个结果,例如 (… (…)…(…)…) ,这里有三个括号,那它最后返回的结果集就是 [ [a,b,c], [a,b,c], [a,b,c]… …] 这种形式的,还不懂的话可以将上面的中括号换成小括号再运行一下程序就懂了;
|
:竖杠,表示或的意思,例如:\d|\s 会匹配一个字符或者是一个数字;
{… …}:大括号,有两种用法,一种是和小括号和中括号一样,另一种就是在上面表达式中的功能
字符 | 描述 |
---|---|
{n} | n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。 |
{n,} | n 是一个非负整数。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。‘o{1,}’ 等价于 ‘o+’。‘o{0,}’ 则等价于 ‘o*’。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 将匹配 “fooooood” 中的前三个 o。‘o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。 |