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]
Обратите внимание, что [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
должен использоваться только для числовых типов, а строки не являются числовыми.