Комбинация регулярных выражений для извлечения отдельных списков из текста - PullRequest
0 голосов
/ 05 июля 2018

Я искал на этом сайте ответ на свой вопрос, но, боюсь, должен признать, что я слишком неквалифицирован в регулярных выражениях, чтобы знать, что я на самом деле делаю. Я пробовал некоторые вещи, такие как «регулярные выражения до, но не включая», но здесь мне может понадобиться что-то более сложное.

Проблема в следующем: у меня есть текстовый файл со списками весовых векторов, с, к сожалению, написаны. Ниже приведен пример.

[[ 0.47135318  0.47360223 -0.29183203 -0.20285653 -0.24205938  0.44837664
0.46629536 -0.37894324 -0.56180424  0.39049615 -0.2712361  -0.47643767
-0.23300994 -0.44815785 -0.2259743  -0.05906764  0.45864844  0.10246178
-0.51351896  0.74671963 -0.18561933 -0.69961443 -0.07254306  0.45491038
 0.56867757 -0.03060815 -0.51135513 -0.04696331 -0.78495142 -0.42022865
 0.42385724  0.24696444  0.46327183  0.18657349  0.04442976 -0.21097974
-0.67817945  0.69659755  0.3935923   0.08655193] [ 0.6741357   0.61594194 
-0.41379963 -0.5800664  -0.21569918  0.54299051
 0.31068042 -0.5772656  -0.80237417  0.77145391 -0.34012795 -0.65051644
-0.35222124 -0.60855949 -0.28849176 -0.49884114  0.67613887  0.0866989
-0.57734352  0.62752623 -0.31577458 -0.77615056  0.05771168  0.51538359
 0.61697831 -0.2529181  -0.66507973 -0.20273329 -0.79521598 -0.51694596
 0.40731803  0.44272373  0.64829285  0.74434366  0.21153787  0.00787646
-0.89556612  0.7784237   0.49065378  0.5832486 ]]

Я бы хотел извлечь все весовые векторы отдельно и поместить их в список, подобный [vec, vec, vec, ...]. Теперь я могу только построчно читать файл и извлекать числа, но как мне справиться с началом и окончанием двух отдельных векторов? Так как это TXT-файл, я понятия не имею.

Редактировать: я пробовал ниже, сложение всей строки вместе, а затем поиск в скобках.

with open(filename, 'r') as f:
weights = ''
for line in f:
    weights += line
print(re.findall(r'(?:(?!\]).)*', weights))

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Вы можете сделать это так: Сначала все содержимое одного списка https://regex101.com/r/ue2NTo/1

Чем пройти через мах и отдельные номера https://regex101.com/r/SFc9eY/1

import re
with open('data.txt', 'r') as myfile:
    all_lists = []
    filecontent=myfile.read()
    for list_match in re.finditer("(?:(?:-?\d+\.?\d+)\s*)+", filecontent):
        current_list = []
        for value_match in re.finditer("(?:-?\d+\.?\d+)", list_match.group(0)):
            current_list.append(value_match.group(0))
        all_lists.append(current_list)

print(all_lists[0]) затем дает:

['0.47135318', '0.47360223', '-0.29183203', '-0.20285653', '-0.24205938', '0.44837664', '0.46629536', '-0.37894324', '-0.56180424', '0.39049615', '0.39049615' '' -0.2712361 ',' -0.47643767 ',' -0.23300994 ',' -0.44815785 ',' -0.2259743 ',' -0.05906764 ',' 0.45864844 ',' 0.10246178 ',' -0.51351896 ',' 0.74671963 ',' -0,1 , «-0,69961443», «-0,07254306», «0,45491038», «0,56867757», «-0,03060815», «-0,51135513», «-0,04696331», «-0,78495142», «-0,42022865», «0,423846944», 0,2238572464, «0,2238572464» ',' 0.46327183 ',' 0.18657349 ',' 0.04442976 ',' -0.21097974 ',' -0.67817945 ',' 0.69659755 ',' 0.3935923 ',' 0.08655193 ']

0 голосов
/ 05 июля 2018

Да, используйте строку регулярного выражения r'\[+(.*?)\]'. Это должно показать, что происходит.


EDIT:

with open(filename, 'r') as f:
    weights = ''
    for line in f:
        weights += line

Это очень, очень медленно. Просто сделай

with open(filename) as f:
    weights = f.read()

weights = '''[[ 0.47135318  0.47360223 -0.29183203 -0.20285653 -0.24205938  0.44837664
0.46629536 -0.37894324 -0.56180424  0.39049615 -0.2712361  -0.47643767
-0.23300994 -0.44815785 -0.2259743  -0.05906764  0.45864844  0.10246178
-0.51351896  0.74671963 -0.18561933 -0.69961443 -0.07254306  0.45491038
 0.56867757 -0.03060815 -0.51135513 -0.04696331 -0.78495142 -0.42022865
 0.42385724  0.24696444  0.46327183  0.18657349  0.04442976 -0.21097974
-0.67817945  0.69659755  0.3935923   0.08655193] [ 0.6741357   0.61594194 
-0.41379963 -0.5800664  -0.21569918  0.54299051
 0.31068042 -0.5772656  -0.80237417  0.77145391 -0.34012795 -0.65051644
-0.35222124 -0.60855949 -0.28849176 -0.49884114  0.67613887  0.0866989
-0.57734352  0.62752623 -0.31577458 -0.77615056  0.05771168  0.51538359
 0.61697831 -0.2529181  -0.66507973 -0.20273329 -0.79521598 -0.51694596
 0.40731803  0.44272373  0.64829285  0.74434366  0.21153787  0.00787646
-0.89556612  0.7784237   0.49065378  0.5832486 ]]'''  # just as example

res = [[float(x) for x in a.split()] 
       for a in re.findall(r'\[+(.*?)\]', weights, re.DOTALL)]

Выходы

[[0.47135318,
  0.47360223,
  -0.29183203,
  -0.20285653,
  -0.24205938,
  0.44837664,
  0.46629536,
  -0.37894324,
  -0.56180424,
  0.39049615,
  -0.2712361,
  -0.47643767,
  -0.23300994,
  -0.44815785,
  -0.2259743,
  -0.05906764,
  0.45864844,
  0.10246178,
  -0.51351896,
  0.74671963,
  -0.18561933,
  -0.69961443,
  -0.07254306,
  0.45491038,
  0.56867757,
  -0.03060815,
  -0.51135513,
  -0.04696331,
  -0.78495142,
  -0.42022865,
  0.42385724,
  0.24696444,
  0.46327183,
  0.18657349,
  0.04442976,
  -0.21097974,
  -0.67817945,
  0.69659755,
  0.3935923,
  0.08655193],
 [0.6741357,
  0.61594194,
  -0.41379963,
  -0.5800664,
  -0.21569918,
  0.54299051,
  0.31068042,
  -0.5772656,
  -0.80237417,
  0.77145391,
  -0.34012795,
  -0.65051644,
  -0.35222124,
  -0.60855949,
  -0.28849176,
  -0.49884114,
  0.67613887,
  0.0866989,
  -0.57734352,
  0.62752623,
  -0.31577458,
  -0.77615056,
  0.05771168,
  0.51538359,
  0.61697831,
  -0.2529181,
  -0.66507973,
  -0.20273329,
  -0.79521598,
  -0.51694596,
  0.40731803,
  0.44272373,
  0.64829285,
  0.74434366,
  0.21153787,
  0.00787646,
  -0.89556612,
  0.7784237,
  0.49065378,
  0.5832486]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...