Не удается понять сообщение об ошибке из незаконного списка кортежей

s = r'abc123d, hello 3.1415926, this is my book'
print re.findall(r'-?[0-9]+(?:\.[0-9]*)?|-?\.[0-9]+',s)

Вам не нужно escape дважды, когда вы используете raw mode.

Выход: ['123', '3.1415926']

Также тип возврата будет списком strings .Если вы хотите, чтобы возвращаемый тип, как integers и floats, использовал map

import re,ast
s = r'abc123d, hello 3.1415926, this is my book'
print map(ast.literal_eval,re.findall(r'-?[0-9]+(?:\.[0-9]*)?|-?\.[0-9]+',s))

Выход: [123, 3.1415926]

0
задан user8314628 13 July 2018 в 22:48
поделиться

1 ответ

Обратите внимание, что [1, "One"] уже вызывает ошибку.

Давайте проанализируем его ошибку: ключевая точка

   Could not deduce (Num [Char]) arising from the literal ‘1’

Это на самом деле означает «Мне нужно использовать 1 :: [Char] , так как это единственный способ, которым список может ввести проверку. Однако я не знаю, как интерпретировать литерал 1 как [Char] ». (Напомним, что [Char] и String являются точно такими же типами, и оба являются типом строковых литералов, таких как "One".)

Haskell немного отличается своей обработкой числовых литералы вроде 1. Примерно обрабатывается так, как если бы Integer s, тип целочисленной произвольной точности, а затем сразу же преобразовывался в желаемый тип, используя метод fromInteger typeclass Num.

class Num a where
   fromInteger :: Integer -> a
   ...

В стандартных библиотеках этот класс имеет экземпляры для всех числовых типов. Пользователь может добавлять другие, например. для своих пользовательских числовых типов.

Глупый программист мог даже добавить экземпляр для строк!

instance Num [Char] where
   fromInteger n = "urk!" ++ show n

Этот экземпляр фиктивный, поскольку он не может разумно определить другие методы , но в принципе это можно было бы использовать. С этим экземпляром в области, тип исходного кода проверяет! Мы можем проверить его в GHCi:

> [(1,2),("One",2)]
[("urk!1",2),("One",2)]

Обратите внимание, как Haskell преобразовал литерал, как мы сказали ему.

A последнее предупреждение: даже не думайте добавлять такие экземпляр для серьезной программы :) Класс Num должен использоваться только для числовых типов, а строки не являются числовыми.

3
ответ дан chi 17 August 2018 в 12:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: