2013-05-27 4 views
8

Я пытаюсь обнаружить все целые числа и целые числа (из множества других вещей) из строки. Вот регулярные выражения я в настоящее время с помощью:Регулярное выражение для целых чисел и целых чисел?

Целые числа: r"[0-9]+"

Целые: r"[+,-]?[0-9]+"

Вот вопросы:

  1. Все номера регулярное выражение обнаруживая отрицательные числа, а , которого я не могу. Как я могу это решить? Если я использую пробел перед началом регулярного выражения, я получаю только положительные числа, но затем я получаю пробел в начале моего вывода!
  2. Для целых чисел, я хотел бы обнаружить положительные числа в формате +[0-9], но хранить их без знака.
  3. Для целых чисел я хотел бы сохранить любое положительное целое число, обнаруженное знаком, независимо от того, присутствует ли оно в исходной строке.

Практически сейчас: . У меня есть строка, которая говорит «Добавить 10 и -15». Я хочу сохранить целые числа в списке. Я использую findall(). При сохранении номера можно ли хранить '10', как '+10'

+1

не являются "целые числа" и "натуральные числа" то же самое? Я не понимаю, как вы бы различали их. –

+0

Целые числа и целые числа - это одно и то же. Положительные целые числа - натуральные числа. – Cairnarvon

+0

Что вы хотите совместить в строке '" 1.0 и 1e7 "'? Оба являются числами (но считаются «float's by Python»). –

ответ

26

Для положительных целых чисел, используйте

r"(?<![-.])\b[0-9]+\b(?!\.[0-9])" 

Объяснение:

(?<![-.]) # Assert that the previous character isn't a minus sign or a dot. 
\b   # Anchor the match to the start of a number. 
[0-9]+  # Match a number. 
\b   # Anchor the match to the end of the number. 
(?!\.[0-9]) # Assert that no decimal part follows. 

Для подписанных/целых чисел без знака, использование

r"[+-]?(?<!\.)\b[0-9]+\b(?!\.[0-9])" 

Слово границ \b имеют решающее значение для обеспечения соответствия всего числа.

+0

Большое спасибо. Границы были чрезвычайно полезны. –

+1

Практически сейчас: Наконец-то, у меня есть строка, которая говорит «Добавить 10 и -15». Я хочу сохранить целые числа в списке. Я использую findall(). При сохранении номеров можно сохранить «10» как «+10» –

+0

Как я уже упоминал в своем комментарии к вашему вопросу, это невозможно. Regexes может соответствовать только тексту, который уже существует, он не может ничего добавить к совпадению. Вам нужно будет сделать это программно. –

4

У вас его почти было.

import re 

regex = re.compile(r'(\d+)|([\+-]?\d+)') 

s = "1 2 3 4 5 6 +1 +2 +3 -1 -2 -3 +654 -789 321" 
for r in regex.findall(s): 
    if r[0]: 
     # whole (unsigned) 
     print 'whole', r[0] 
    elif r[1]: 
     # a signed integer 
     print 'signed', r[1] 

Результаты:

>>> 
whole 1 
whole 2 
whole 3 
whole 4 
whole 5 
whole 6 
signed +1 
signed +2 
signed +3 
signed -1 
signed -2 
signed -3 
signed +654 
signed -789 
whole 321 

Или вы могли бы использовать "или", чтобы получить фактический результат в "приятнее" способом:

print [r[0] or r[1] for r in regex.findall(s)] 
>>> 
['1', '2', '3', '4', '5', '6', '+1', '+2', '+3', '-1', '-2', '-3', '+654', '-789', '321'] 

Edit: As по вашему запросу "is it possible to store '10' as '+10'":

import re 

def _sign(num): 
    if r[0]: 
     return '+%s'%r[0] 
    else: 
     return r[1] 

regex = re.compile(r'(\d+)|([\+-]?\d+)') 
s = "1 2 3 4 5 6 +1 +2 +3 -1 -2 -3 +654 -789 321"  
print [_sign(r) for r in regex.findall(s)] 
>>> 
['+1', '+2', '+3', '+4', '+5', '+6', '+1', '+2', '+3', '-1', '-2', '-3', '+654', '-789', '+321'] 

Или в 1-линии:

print ['+%s'%r[0] if r[0] else r[1] for r in regex.findall(s)] 
>>> 
['+1', '+2', '+3', '+4', '+5', '+6', '+1', '+2', '+3', '-1', '-2', '-3', '+654', '-789', '+321'] 
+0

Практически сейчас: . У меня есть строка, которая говорит« Добавить 10 и -15 ». Я хочу сохранить целые числа в списке. Я использую findall(). При хранении чисел можно сохранить «10» как «+10» –

+0

@SahilThapar См. Мое редактирование. –

+0

Спасибо, мне просто нужно было знать, можно ли это сделать, извлекая регулярное выражение и не используя явную функцию. В любом случае спасибо! –

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