Python正则表达式-提取浮点模式

时间:2019-03-16 00:32:43

标签: python regex python-3.x

我正在尝试从字符串中提取特定的“浮点数”,它包含多种格式的“整数”,“浮点数”和日期。有问题的特定“浮动”以一些标准化的文本为开头。

字符串样本

my_string = """03/14/2019 07:07 AM
Soles in mDm : 2864.35⬇
BTC purchase in mdm: 11,202,782.0⬇
"""

我已经能够从2864.35中提取my_string所需的浮动模式,但是如果该特定浮动模式发生了变化或另一个具有相同格式的浮动出现,我的脚本将不会返回期望的结果

regex = r"(\d+\.\d+)"
matches = re.findall(regex, my_string)
for match in matches:
    print(match)
  • 由于数值格式不一致,它可能会截断所需的浮点数
  • 它可能会打印两个浮点数,因为不希望有的浮点数的数字模式太相似而无法被当前正则表达式regex过滤掉

期望从正则表达式regex返回

  • 浮点数具有灵活的整数部分,有时省略逗号,即。 45000.50其他时间45,000.50
  • 唯一行标识符:Soles可以是大写/小写
  • 行标识符:浮点前缀:
  • 它只能返回一个浮点数

仅在字符串的第二行中需要浮点数的某些变化

下面显示的是同一行的三个示例,my_string中的第二行。尽管有任何变化,例如鞋底鞋底

,该正则表达式只能返回第二行
  • 鞋底mDm:2864.35⬇
  • 鞋底MDM:2,864.35
  • mdm鞋底:2,864.355

非常感谢您提供有关编辑或重写当前正则表达式regex的任何帮助

2 个答案:

答案 0 :(得分:2)

编辑-嗯...如果必须遵循soles,希望对您有帮助

尝试这些,因为我的控制台不能接受多余的字符,但是要根据您的输入:

>>> my_string = """03/14/2019 07:07 AM
Soles in mDm : 2864.35
BTC purchase in mdm: 11,202,782.0
Soles in mDm : 2864.35
soles MDM: 2,864.35
Soles in mdm :2,864.355
"""


>>> re.findall('(?i)soles[\S\s]*?([\d]+[\d,]*\.[\d]+)', my_string)

#Output
['2864.35', '2864.35', '2,864.35', '2,864.355']



>>> re.findall('[S|s]oles[\S\s]*?([\d]+[\d,]*\.[\d]+)', my_string)

#Output
['2864.35', '2864.35', '2,864.35', '2,864.355']

答案 1 :(得分:0)

如果要匹配多个实例,则只需添加g标志,否则它将仅匹配单个实例。 REGEX

(?<=:)\s?([\d,]*\.\d+)

使用Python

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"(?<=:)\s?([\d,]*\.\d+)"

test_str = ("\n"
    "    Soles in mDm : 2864.35⬇\n"
    "    soles MDM: 2,864.35\n"
    "    Soles in mdm :2,864.355\n")

matches = re.search(regex, test_str, re.IGNORECASE)

if matches:
    print ("Match was found at {start}-{end}: {match}".format(start = matches.start(), end = matches.end(), match = matches.group()))

    for groupNum in range(0, len(matches.groups())):
        groupNum = groupNum + 1

        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = matches.start(groupNum), end = matches.end(groupNum), group = matches.group(groupNum)))