Регулярное выражение в Python для обнаружения чисел, которые являются целыми числами, числами с плавающей точкой или в научной нотации - PullRequest
0 голосов
/ 20 декабря 2018

Как я могу создать регулярное выражение для принятия чисел в Python?Числа могут быть целыми числами, числами с плавающей точкой или в формате 3e + 3 или 3e-3.

Я хочу сопоставить только начало строки, и если присутствует число в любом из вышеупомянутых форматоввернуть это число и остаток строки.

Редактировать :

Например,

Ввод >> 290.07abcd Выход >> [290.07, abcd]

Вход >> abc123 Выход >> Нет

Кроме того, толькопервое вхождение должно быть проверено.

Например,

Вход >> -390-400abc

Выход >> [- 390, -400abc]

Как это сделать с помощью Python?Я пробовал следующее, но это не дает мне ожидаемый результат:

import re
r = input()
x = re.search('^[+-]?\d*(\.\d+)?([+-][eE]\d+)?', r)
if x:
    print("x present: ", x.group())
else:
    print(None)

Например,

Ввод >> 100abc

Выход >> x присутствует: 100


Вход >> abc100

Выход >> x присутствует:

Ожидаемый результат >> Нет

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Попробуйте этот шаблон:

\d+(\.\d+)?(e[+-]\d+)?

Это соответствует:

100
100.123
100e+3
100.123e-3

Демо

0 голосов
/ 20 декабря 2018

Вот одна возможность.Шаблон для числа:

number_pattern = "[+-]?((\d+\.\d*)|(\.\d+)|(\d+))([eE][+-]?\d+)?"

Шаблон состоит из:

  • необязательный знак;
  • три варианта основной части номера:
    • одна или несколько цифр, за которыми следует десятичная точка, за которой следуют ноль или более цифр;
    • десятичная точка, за которой следуют одна или несколько цифр;
    • одна или несколько цифр (без десятичной точки);
  • необязательная экспоненциальная часть, состоящая из:
    • e или E;
    • необязательный знак;
    • одна или несколько цифр.

Первая и третья альтернативы для основной части номера могут быть объединены всостоят из одной или нескольких цифр, за которыми может следовать десятичная точка, за которой следует ноль или несколько цифр.Тогда числовой шаблон будет

number_pattern = "[+-]?((\d+(\.\d*)?)|(\.\d+))([eE][+-]?\d+)?"

. Вы можете использовать его для создания функции, которая выполняет то, что вы просили:

pattern = "(" + number_pattern + ")(.*)"
compiled = re.compile(pattern)

def number_split(s):
    match = compiled.match(s)
    if match is None:
        return None
    groups = match.groups()
    return groups[0], groups[-1]

Некоторые примеры:

In [4]: print(number_split("290.07abcd"))
('290.07', 'abcd')

In [5]: print(number_split("abc123"))
None

In [6]: print(number_split("-390-400abc"))
('-390', '-400abc')

In [7]: print(number_split("0.e-3"))
('0.e-3', '')

In [8]: print(number_split("0x"))
('0', 'x')

In [9]: print(number_split(".123e2"))
('.123e2', '')
0 голосов
/ 20 декабря 2018

Вы можете использовать это

^[+-]?\d*(\.\d+)?([+-][eE]\d+)?$
  • ^ - начало строки.
  • [+-] - совпадения + или -.
  • \d* - соответствует нулю или более цифрам.
  • (\.\d+)? - соответствует ., за которым следует одна или несколько цифр.
  • ([+-][eE]\d+)? - соответствует+ или -, за которыми следуют e или E с последующими цифрами.
  • $ - Конец строки.

Демонстрация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...