регулярное выражение Python index: count - PullRequest
0 голосов
/ 01 июня 2018

У меня есть список значений в виде строки "index: count". Я хочу извлечь индекс и считать в строке, как показано в следующем коде:

          string="358:6 1260:2 1533:7 1548:292 1550:48 1561:3 1564:186"
          values=[v for v in re.findall('.+?:.+?.', string)]
          for g in values:
              index=g[:g.index(":")]
              count=g[g.index(":")+1:]
              print(int(index)+" "+str(count))

Но я получил сообщение об ошибке

ValueError: недопустимый литерал для int () с основанием 10: '2 1550'

кажется, что я неправильно написал операции с регулярными выражениями.есть идеи как это исправить?

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Вы уже используете регулярное выражение - почему бы просто не использовать группировки и не создавать из них дикт?словарь (все как строки).Таким образом вы теряете свой порядок, но для ключей / значений это не должно быть проблемой.

Если вам нужен этот порядок, просто используйте возвращенный список findall:

values = re.findall('(\d+):(\d+) ?', s) # use capturing groups

, который дает вам список кортежей с вашими возвращенными совпадениями:

[('358', '6'), ('1260', '2'), ('1533', '7'), ('1548', '292'),
 ('1550', '48'), ('1561', '3'), ('1564', '186')]
0 голосов
/ 01 июня 2018

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

РЕДАКТИРОВАТЬ ПРИМЕЧАНИЕ: шаблон .+:.+, который я вводил в предыдущих изменениях, был неправильным или даже неправильным.плохое регулярное выражение для захвата желаемого шаблона.Пожалуйста, используйте шаблон \d+:\d+ вместо.Однако я оставляю это так, потому что это все еще может решить проблему OP, используя другой обходной путь.

Пока ваши данные не искажены или содержат шум и аккуратно разделены пробелами, я думаю, что '.+:.+' достаточночтобы найти ваш index:count формат.Вероятно, лучший способ - использовать \d+:\d+, поскольку вы знаете, что по крайней мере один digit отделен :, а за ним следует другой digit.

Вот хорошие ссылки regexr и regex101 для лучшего проектирования / визуализации шаблона регулярных выражений.

Если вы используете шаблон .+:.+, он вернет вам строку целиком, так как соответствует строке каквсе.Вам необходимо предварительно обработать результат, так как re.findall возвращает list, в этом примере он возвращает только 1 элемент.

In [  ]: string="358:6 1260:2 1533:7 1548:292 1550:48 1561:3 1564:186"
    ...: values=[v for v in re.findall('.+:.+', string)]
    ...: print(values)
['358:6 1260:2 1533:7 1548:292 1550:48 1561:3 1564:186']

Поскольку он возвращает список только с одним элементом, вы можете использовать pop(), чтобы извлечь единственный элемент str и распечатать его с помощью функции str split().

In [  ]: print(values.pop().split())
['358:6', '1260:2', '1533:7', '1548:292', '1550:48', '1561:3', '1564:186']

Если вы используете шаблон \d+:\d+, он сразу вернет вам красиво разделенный список, поскольку он правильно их найдет.Поэтому вы можете напрямую напечатать его значение.

In [  ]: string="358:6 1260:2 1533:7 1548:292 1550:48 1561:3 1564:186"
    ...: values=[v for v in re.findall('\d+:\d+', string)]
    ...: print(values)
['358:6', '1260:2', '1533:7', '1548:292', '1550:48', '1561:3', '1564:186']

Наконец, вы можете красиво распечатать результат с помощью встроенного форматирования строки . Отказ от ответственности: Мне не принадлежит этот веб-сайт, я просто нашел его полезным для меня, начинающего:)

In [  ]: for s in values:
    ...:     index, count = s.split(":")
    ...:     print("Index: {:>8} Count: {:>8}".format(index, count))
    ...:     
Index:      358 Count:        6
Index:     1260 Count:        2
Index:     1533 Count:        7
Index:     1548 Count:      292
Index:     1550 Count:       48
Index:     1561 Count:        3
Index:     1564 Count:      186
0 голосов
/ 01 июня 2018

Вы пытаетесь объединить строку и int.

Заменить

print(int(index)+" "+str(count))

на

print(str(index)+" "+str(count))

Вы также можете упростить свой код.

Пример:

import re
string="358:6 1260:2 1533:7 1548:292 1550:48 1561:3 1564:186"
values=[v for v in re.findall('.+?:.+?.', string)]
for g in values:
  index, count =g.split(":")
  print(index, count)
...