【问题标题】:Creating a Regex Pattern to Extract Floats and Integers创建正则表达式模式以提取浮点数和整数
【发布时间】:2019-01-28 15:53:02
【问题描述】:

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

在查看数据营教程和有关堆栈溢出的其他问题后,我尝试创建一个正则表达式模式,但我无法创建一个能够提取所有数字并打印它们的模式。本质上,我创建的 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))

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

【问题讨论】:

  • d 匹配 d\d 匹配一个数字。
  • @Wiktor Stribiżew 好的,我在我的代码中解决了这个问题。但是,当我在 Python 中尝试它时,它仍然没有返回指定模式的任何结果。
  • 试试Travel['Rate Breakup Description'].str.findall(r'\d*\.?\d+(?=HR|EA)').apply(', '.join)
  • @Wiktor Stribizew 当我将它应用到 f​​or 循环并尝试将它们一起打印时出现此错误 AttributeError: 'Series' object has no attribute 'join'
  • 试试.apply(', '.join)。以防万一您在输入字符串中有超过 1 个匹配项。如果每个字符串只有 1 个匹配项,请使用 Travel['Result'] = Travel['Rate Breakup Description'].str.extract(r'(\d*\.?\d+)(?:HR|EA)', expand=False)

标签: python regex for-loop search


【解决方案1】:

你可以使用

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) 是一个非捕获组(因此不返回)匹配HR 或@ 987654336@.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    相关资源
    最近更新 更多