2015-02-12 4 views
1

Я пытаюсь разобрать текстовый файл и извлечь из него некоторые целые числа. Каждая строка в моем текстовом файле этого формата:Проблемы с использованием re.findall() в python

а и б

где представляет собой целое число и Ь может быть поплавок или целое

например. '4 и 10.2356' или '400 и 25'

Мне нужно извлечь оба a и b. Я пытаюсь использовать re.findall(), чтобы сделать это:

print re.findall("\d+", txt)[0] #extract a 

#Extract b   
try: 
    print float(re.findall("\d+.\d+", txt)[1]) 
except IndexError: 
    print float(re.findall("\d+.\d+", txt)[0]) 

здесь TXT представляет собой одну строку из файла. Причина блока try и except следующая:

если a - целое число в одну цифру, например. 4, часть запроса просто возвращает b. Однако, если a не является целым числом, например. 400, часть запроса возвращает код a и b. Я нашел это странным.

Однако я не знаю, как изменить приведенный выше код, чтобы извлечь b, когда это целое число. Я попробовал попробовать еще одну попытку, кроме bock, в существующем блоке, но это дало мне странные результаты (в некоторых случаях a и b были объединены). Пожалуйста, помогите мне.

Кроме того, может кто-нибудь скажет мне разницу между \ d + и \ d +. \ D + и почему \ d +. \ D + возвращает 400, а не 4, даже если оба являются целыми числами.

ответ

2

Просто введите шаблон, который соответствует десятичной части как необязательный.

>>> s = '4 and 10.2356' 
>>> re.findall(r'\d+(?:\.\d+)?', s) 
['4', '10.2356'] 
>>> print(int(re.findall(r'\d+(?:\.\d+)?', s)[0])) 
4 
>>> print(float(re.findall(r'\d+(?:\.\d+)?', s)[1])) 
10.2356 
  • \d+ соответствует одному или более цифр.
  • \d+.\d+ соответствует одной или нескольким цифрам плюс любой отдельный символ плюс одна или несколько цифр.
  • \d+\.\d+ соответствует одному или нескольким символам цифр с буквальной точкой плюс одна или несколько цифр.
  • \d+(?:\.\d+)? соответствует целым числам, а также числам с плавающей запятой, потому что мы сделали шаблон, который соответствует десятичной части как необязательный. ? после того, как группа захвата или не захвата превратит всю группу в необязательную.
+0

Большое спасибо! – foobar

Смежные вопросы