2012-04-05 5 views
5

В этой программе, которую я пытаюсь сделать, у меня есть выражение (например, «I = 23mm» или «H = 4V»), и я пытаюсь извлечь 23 (или 4), чтобы я мог превратить его в целое число.Извлечение числа из строки из 1 слова

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

Один пример, который я видел, но не работал бы был -

I="I=2.7A" 
[int(s) for s in I.split() if s.isdigit()] 

Это не работал бы потому, что она принимает только цифры разделяются пробелами. Если в слове int078vert было число, оно не извлекло бы его. Кроме того, у меня нет пробелов для разграничения.

Я попробовал один, который выглядел так,

re.findall("\d+.\d+", "Amps= 1.4 I") 

, но оно не сработало, потому что число, которое передается не всегда 2 цифры. Это может быть что-то вроде 5 или что-то вроде 13.6.

Какой код нужно ли мне писать так, что если я передать строку, такую ​​как

I="I=2.4A" 

или

I="A=3V" 

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

+0

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

+0

Да. Каждая строка всегда будет иметь 1 номер, но может иметь несколько десятичных знаков, чтобы сделать это число. – Kyle

ответ

11
>>> import re 
>>> I = "I=2.7A" 
>>> s = re.search(r"\d+(\.\d+)?", I) 
>>> s.group(0) 
'2.7' 
>>> I = "A=3V" 
>>> s = re.search(r"\d+(\.\d+)?", I) 
>>> s.group(0) 
'3' 
>>> I = "I=2.723A" 
>>> s = re.search(r"\d+(\.\d+)?", I) 
>>> s.group(0) 
'2.723' 
+0

Большое спасибо. Хорошо работает. – Kyle

3

RE, вероятно, хорошо для этого, но как один RE ответ уже отвечал, я возьму свой некоммерческий регулярок пример и изменить его:


One example I saw but wouldnt work was - 

I="I=2.7A" 
[int(s) for s in I.split() if s.isdigit()] 

Хорошо, что split() может принимать аргументы. Попробуйте это:

extracted = float("".join(i for i in I.split("=")[1] if i.isdigit() or i == ".")) 

Кстати, вот разбивка RE вы предоставили:

"\d+.\d+" 
\d+ #match one or more decimal digits 
. #match any character -- a lone period is just a wildcard 
\d+ #match one or more decimal digits again 

Один из способов сделать это (правильно) будет:

"\d+\.?\d*" 
\d+ #match one or more decimal digits 
\.? #match 0 or 1 periods (notice how I escaped the period) 
\d* #match 0 or more decimal digits 
+0

Ваше разделенное решение довольно аккуратное: D. +1 –

+0

Оцените другой метод. +1 – Kyle

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