我搜索的文本文件看起来像很多这样的文本块:
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然后它将不再匹配相同的模式,但如果有办法采取这种方式会很好考虑到了。
答案 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();
}
}
当然,这个用途有限,因为你无法以这种方式真正创建复杂的模式 - 例如,如果你在模式中使用了一个组,它将返回该组。