【问题标题】:(Python) Is there a way to extract substrings/numbers from an entire string?(Python)有没有办法从整个字符串中提取子字符串/数字?
【发布时间】:2021-10-04 10:12:33
【问题描述】:

我有一个包含唯一实用程序数据的元组列表,包括消耗量(立方英尺)、加仑水和估计价格。有 13 个元组,一个用于一年中的每个月,一个用于年末的总消费。我的目标是提取这三个信息,将它们存储到数据框中,并最终将它们导出到 Excel 工作表中。

这是我将元组排序为字符串后的样子。 (我将它们迭代并排序为字符串的原因是因为它们最初是 Soup(BeautifulSoup) 格式,很难组织成列表。)

这是一个元组的样子:

[\'<area alt="" coords="151,115,181,382" onmouseout="DisplayTooltip(\\\'\\\');" onmouseover="DisplayTooltip(\\\'Consumption = 49,094.00 CF (367,223.12 Gallons)  &lt;br /&gt; Approximate Charge = $5,073.42\\\');" shape="rect"/>\']'

下面是元组的完整列表。唯一的例外是最后(第 13 个)元组列出了“总消费”而不是“消费”

['[\'<area alt="" coords="113,88,143,382" onmouseout="DisplayTooltip(\\\'\\\');" onmouseover="DisplayTooltip(\\\'**Consumption = 54,070.00 CF (404,443.60 Gallons)**  &lt;br /&gt; **Approximate Charge = $5,587.65**\\\');" shape="rect"/>\']', '[\'<area alt="" coords="151,115,181,382" onmouseout="DisplayTooltip(\\\'\\\');" onmouseover="DisplayTooltip(\\\'Consumption = 49,094.00 CF (367,223.12 Gallons)  &lt;br /&gt; Approximate Charge = $5,073.42\\\');" shape="rect"/>\']', '[\'<area alt="" coords="188,99,218,382" onmouseout="DisplayTooltip(\\\'\\\');" onmouseover="DisplayTooltip(\\\'Consumption = 51,921.00 CF (388,369.08 Gallons)  &lt;br /&gt; Approximate Charge = $5,365.57\\\');" shape="rect"/>\']', '[\'<area alt="" coords="226,125,256,382" onmouseout="DisplayTooltip(\\\'\\\');" onmouseover="DisplayTooltip(\\\'Consumption = 47,122.00 CF (352,472.56 Gallons)  &lt;br /&gt; Approximate Charge = $4,869.63\\\');" shape="rect"/>\']', '[\'<area alt="" coords="263,101,294,382" onmouseout="DisplayTooltip(\\\'\\\');" onmouseover="DisplayTooltip(\\\'Consumption = 51,687.00 CF (386,618.76 Gallons)  &lt;br /&gt; Approximate Charge = $5,341.39\\\');" shape="rect"/>\']', '[\'<area alt="" coords="301,139,331,382" onmouseout="DisplayTooltip(\\\'\\\');" onmouseover="DisplayTooltip(\\\'Consumption = 44,643.00 CF (333,929.64 Gallons)  &lt;br /&gt; Approximate Charge = $4,613.45\\\');" shape="rect"/>\']', '[\'<area alt="" coords="339,176,369,382" onmouseout="DisplayTooltip(\\\'\\\');" onmouseover="DisplayTooltip(\\\'Consumption = 37,770.00 CF (282,519.60 Gallons)  &lt;br /&gt; Approximate Charge = $4,010.80\\\');" shape="rect"/>\']', '[\'<area alt="" coords="376,382,407,383" onmouseout="DisplayTooltip(\\\'\\\');" onmouseover="DisplayTooltip(\\\'Consumption = 0.00 CF (0.00 Gallons)  &lt;br /&gt; Approximate Charge = $0.00\\\');" shape="rect"/>\']', '[\'<area alt="" coords="414,382,444,383" onmouseout="DisplayTooltip(\\\'\\\');" onmouseover="DisplayTooltip(\\\'Consumption = 0.00 CF (0.00 Gallons)  &lt;br /&gt; Approximate Charge = $0.00\\\');" shape="rect"/>\']', '[\'<area alt="" coords="452,382,482,383" onmouseout="DisplayTooltip(\\\'\\\');" onmouseover="DisplayTooltip(\\\'Consumption = 0.00 CF (0.00 Gallons)  &lt;br /&gt; Approximate Charge = $0.00\\\');" shape="rect"/>\']', '[\'<area alt="" coords="489,382,519,383" onmouseout="DisplayTooltip(\\\'\\\');" onmouseover="DisplayTooltip(\\\'Consumption = 0.00 CF (0.00 Gallons)  &lt;br /&gt; Approximate Charge = $0.00\\\');" shape="rect"/>\']', '[\'<area alt="" coords="527,382,557,383" onmouseout="DisplayTooltip(\\\'\\\');" onmouseover="DisplayTooltip(\\\'Consumption = 0.00 CF (0.00 Gallons)  &lt;br /&gt; Approximate Charge = $0.00\\\');" shape="rect"/>\']', '[\'<area alt="" coords="653,68,733,382" onmouseout="DisplayTooltip(\\\'\\\');" onmouseover="DisplayTooltip(\\\'Total Consumption = 336,307 CF (2,515,576 Gallons) &lt;br /&gt; Approximate Charge = $34,861.91\\\');" shape="rect"/>\']']

我写了这个正则表达式来提取加仑:

gallons = re.search('CF((.*)Gallons)', test_line)
print(gallons)

哪个输出这个:

<re.Match object; span=(128, 150), match='CF (404,443.60 Gallons'>

这并没有真正让它变得更容易,因为现在我必须找到一种方法来提取 '404,443,.60'

如果有人可以推荐一种从元组列表中提取这三段数据的方法(假设我很可能必须在元组列表上创建某种形式的迭代)并将它们存储到一个数据帧中非常有帮助。最终目标是将这些数字存储到数据框中,并最终导出到 Excel 工作表中。

【问题讨论】:

    标签: python regex dataframe


    【解决方案1】:

    这可能会做你想做的事:

    gallons = re.search(r'(?<=CF\s\()[\d,\.]*(?= Gallons)', test_line)
    

    【讨论】:

    • 您希望开头的r 位于引号外部,而不是内部。 FTFY。
    • 谢谢!我在手机上,所以这些事情发生了:'D
    • 匹配成功,谢谢!但是,当我打印加仑时,它会返回整个“” 有没有办法只返回数字?
    • 在匹配对象加仑上使用分组方法:gallons.group()
    • 它解决了您的问题吗?如果您仍然遇到问题或将问题标记为已解决,请告诉我们。
    【解决方案2】:

    您可以使用捕获组,并通过匹配括号来使模式更加具体,并捕获组 1 中左括号后带有可选小数部分的数字。

    \bCF\s\((\d+(?:\.\d+)*(?:,\d+(?:\.\d+)*)*)\sGallons\)
    
    • \bCF\s 防止空匹配的单词边界,匹配 CF 和空格字符
    • \(匹配(
    • ( 捕获第 1 组
      • \d+(?:\.\d+)* 匹配 1+ 位数字和可选的小数部分
      • (?:,\d+(?:\.\d+)*)* 可选择重复匹配 , 和 1+ 位,可选小数部分
    • )关闭第一组
    • \sGallons\) 匹配一个空格字符和Gallons)

    Regex demo | Python demo

    例如

    import re
     
    pattern=r"\bCF\s\((\d+(?:\.\d+)*(?:,\d+(?:\.\d+)*)*)\sGallons\)"
     
    strings = [r'Consumption = 49,094.00 CF (367,223.12 Gallons)']
     
    for s in strings:
        m = re.search(pattern, s)
        if m:
          gallons = m.group(1)
          print(gallons)
    

    输出

    367,223.12
    

    【讨论】:

      【解决方案3】:

      你可以得到匹配的组:

      import re
      re_gallons = re.compile(r'CF \((.*)Gallons\)')
      print(re_gallons.search(test_line).group(1))
      

      【讨论】:

      • 谢谢你这个工作,但我无法将它合并到迭代循环中
      • 您可以将每个重新添加到列表中并对其进行迭代,将每个匹配项保存到结果列表中。
      • 如果您发布更多代码会有所帮助。
      猜你喜欢
      • 1970-01-01
      • 2020-04-17
      • 2014-04-07
      • 2022-12-11
      • 2022-01-14
      • 2023-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多