如何使用正则表达式获取浮点数的第n次出现?

时间:2017-07-08 01:11:39

标签: python regex

我搜索的文本文件看起来像很多这样的文本块:

  

MKC,2017-06-23 07:54,-94.5930,39.1230,79.00,73.90,84.41,220.00,4.00,0.00,29.68,1003.90,10.00,M,FEW,M,M,M,9500.00,M ,M,M,M,KMKC 230754Z 22004KT 10SM FEW095 26/23 A2968 RMK AO2 SLP039 T02610233

(那就是一行)

我希望在匹配r',\d\.\d{2},'的行中抓住第二个匹配项,在本例中为0.00

我不知道如何指定我想要第n次出现的模式。

额外:我从来没有看到匹配相同模式的第一个值超过9.99,意味着10.00然后它将不再匹配相同的模式,但如果有办法采取这种方式会很好考虑到了。

4 个答案:

答案 0 :(得分:1)

您可以使用re.findall。它返回一个你可以访问的列表:

result = re.findall(r',\d\.\d{2},', input)
result[n] # will return nth instance

答案 1 :(得分:1)

使用echo($line),捕获列表中的浮点数,然后根据需要对其进行索引。

re.findall

如果需要,使用In [85]: import re In [86]: line = '''MKC,2017-06-23 07:54,-94.5930,39.1230,79.00,73.90,84.41,220.00,4.00,0.00,29.6 ...: 8,1003.90,10.00,M,FEW,M,M,M,9500.00,M,M,M,M,KMKC 230754Z 22004KT 10SM FEW095 26/23 A296 ...: 8 RMK AO2 SLP039 T02610233''' In [101]: matches = re.findall(r'(?<!\d|M)-?[\d]+\.[\d]+(?=,|$)', line, re.M) In [102]: matches Out[102]: ['94.5930', '39.1230', '79.00', ... '10.00', '9500.00'] 转换为浮点数:

map

包含In [103]: list(map(float, matches)) Out[103]: [94.593, 39.123, ... 10.0, 9500.0] s:

的更新
M

答案 2 :(得分:0)

您可以在python中使用re.findall(regex, string, flags)函数。这将返回字符串列表中字符串的非重叠匹配。然后,您可以获取返回列表的第二个成员。

答案 3 :(得分:0)

您可以通过动态构建模式以跳过多次出现然后捕获模式来避免全部捕获并保存一些资源(仅在特别大的字符串上显着):

def get_nth_occurrence(pattern, data, n=0):  # n is zero indexed
    result = re.search("(?:{0}.*?){test = "MKC,2017-06-23 07:54,-94.5930,39.1230,79.00,73.90,84.41,220.00,4.00,0.00,29.68," \
       "1003.90,10.00,M,FEW,M,M,M,9500.00,M,M,M,M,KMKC 230754Z 22004KT 10SM FEW095 26/23 " \
       "A2968 RMK AO2 SLP039 T02610233 "

print(get_nth_occurrence(r"\d+\.\d{2}", test, 1))  # 39.12
}({0})".format(pattern, n), data)
    return result.group(1) if result else None

您可以将其测试为:

    private void loadrecord()
    {
        using (MySqlConnection loadcon = new MySqlConnection(connString))
        {
            loadcon.Open();
            MySqlCommand loadcom = new MySqlCommand("SELECT * FROM table1", loadcon);
            MySqlDataAdapter loadad = new MySqlDataAdapter(loadcom);
            DataTable loaddt = new DataTable();
            loadad.Fill(loaddt);

            BindingSource loadbindsource = new BindingSource();
            loadbindsource.DataSource = loaddt;
            dataGridView1.DataSource = loadbindsource;
            loadcon.Close();
        }
    }

当然,这个用途有限,因为你无法以这种方式真正创建复杂的模式 - 例如,如果你在模式中使用了一个组,它将返回该组。