Чтение ввода с использованием строки формата в Python - PullRequest
0 голосов
/ 01 ноября 2018

Предположим, я хочу прочитать последовательность входов, где каждый вход представляет собой кортеж в форме <string> , <integer>, <string>. Кроме того, между запятыми может быть произвольное количество пробелов. Самый простой способ сделать это в C / C ++ - использовать scanf со строкой формата "%s , %d , %s". Что такое эквивалентная функция в Python?

Предположим, мы знали, что каждый вход находится на отдельной строке, тогда вы можете легко проанализировать это в python, используя split и strip. Но требование новой строки усложняет ситуацию. Кроме того, мы могли бы даже иметь странные данные, такие как

<s11>, <i1> , <s12> <s21>, <i2> , <s22> Где s11, i1, s12 - первый вход, а s21, i2, s22 - второй. И scanf все равно сможет справиться с этим. Как это сделать в Python? Я также не хочу брать весь ввод сразу и анализировать его, так как я знаю, что будут другие входы, которые не соответствуют этому формату позже, и я не хочу делать синтаксический анализ вручную.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Вы должны иметь возможность сначала убрать пробел, затем разделить запятыми, а затем обработать получающиеся строки и целые числа так, как вы хотите. Регулярное выражение s\+ соответствует любому ненулевому количеству пробельных символов:

input_string = "    hello     \n  \t   ,    10  ,   world   \n     "
stripped_string = re.sub('\s+', '', input_string)
substrings = stripped_string.split(',')
string1 = substrings[0]
integer1 = int(substrings[1])
string2 = substrings[2]

Вам просто нужно поместить эти последние три строки в цикл, если вам нужно обрабатывать несколько кортежей s, i, s в строке.

РЕДАКТИРОВАТЬ: теперь я понимаю, что вы хотите интерпретировать любой пробел как запятую. Я не уверен, насколько это разумно, но хакерский способ сделать это - заменить все запятые на пробел, разделить на пробел и назвать это днем ​​

input_string = "    hello     \n  \t   ,    10     world   \n     "
stripped_string = re.sub(',', ' ', input_string)
substrings = stripped_string.split()
string1 = substrings[0]
integer1 = int(substrings[1])
string2 = substrings[2]
0 голосов
/ 01 ноября 2018

Для формата с разделителями это довольно просто с модулем csv . К нему можно подключить любой тип файловых входных данных .

И вы справляетесь с зачисткой пробелов и вводом типа вниз по течению. Вот пример, чтобы вы начали:

In [25]: import fileinput

In [26]: import csv

In [28]: reader = csv.reader(fileinput.input())

In [29]: for l in reader:
    ...:     print(l)
    ...:
stdin input -> a,b, c, d
print output -> ['a', 'b', ' c', ' d   ']
...