首页 > 解决方案 > 创建正则表达式模式以提取浮点数和整数

问题描述

我在创建模式识别函数以从数据框列中提取所有数字并打印它们时遇到问题。

在查看数据营教程和堆栈溢出的其他问题后,我尝试创建一个正则表达式模式,但我无法创建一个可以提取所有数字并打印它们的模式。本质上,我创建的 EA 模式和像 1.12 这样的带有浮点数的 HR 模式不会返回结果。

import re
import pandas as pd
data = ['1EA @ 3217.45;', 'ST - .63HR@165;', 'ST - .5HR@123;', 'ST - 1.08HR@165;', '1EA @ 3217.45;', 'ST - .85HR@165;', 'ST - .85HR@165;', '1EA @ 3217.45;', 'ST - .12HR@165;', 'OT - 1.12HR @ 165;', 'ST - .55HR@123;OT - 0.82HR @ 123;', 'ST - .5HR@165;', 'OT - 0.45HR @ 123;', 'ST - .6HR@123;', 'ST - 1.42HR@123;', '1EA @ 1500;', 'ST - .3HR@123;', 'ST - 1HR@111;OT - 0.25HR @ 111;']
Travel = pd.DataFrame(data, columns=['Rate Breakup Description'])

for a in Travel['Rate Breakup Description']:
    print(re.search('.(\d+)HR | (\d+)EA | (\d+)HR | (\d+)EA', a, re.I|re.M))

我的目标是能够拥有一个模式识别功能,该功能将提取所有数字,而不管不同的字符串模式如何,并按照它们出现的顺序打印它们。

标签: pythonregexfor-loopsearch

解决方案


您可以使用

Travel['Result'] = Travel['Rate Breakup Description'].str.findall(r'\d*\.?\d+(?=HR|EA)').apply(', '.join)

模式将匹配

  • \d*- 0+ 位数
  • \.?- 一个可选的.
  • \d+- 1+ 位数
  • (?=HR|EA)- 后跟HREA

.str.findall返回它在输入字符串中找到的所有匹配项,并.apply(', '.join) 使用逗号+空格连接结果。

如果每个输入中预期有一个匹配项,您可以使用替代解决方案:

Travel['Result'] = Travel['Rate Breakup Description'].str.extract(r'(\d*\.?\d+)(?:HR|EA)', expand=False)

这里,(\d*\.?\d+)由于括号,是一个捕获组,这部分由.str.extract(?:HR|EA)是一个非捕获组(因此不返回)匹配HREA


推荐阅读