Если допустимо печатать как 1.d1d2d3d4d5 ... * 2 ^ e1e2e3, то преобразование числа с плавающей запятой в десятичное (-ish) представление может быть простым. Реализация может быть найдена здесь .
Если вам нужно научное представление 1.d1d2 ... * 10 ^ e1e2e3, тогда наивный подход к многократному делению на 10 и извлечению цифр из номер, который у вас есть в формате с плавающей запятой. Вам понадобится какая-то многоцелевая целочисленная библиотека. (Повторно умножить на 10, чтобы извлечь цифры после точки.)
Я не знаю точно, что вы пытаетесь сделать, но ваше регулярное выражение не очень конкретное в его нынешнем виде. Ниже предложено решение того, что может быть улучшением. Это выглядит сложно, но на самом деле это не так уж и плохо, когда сломано.
^(\b(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b|\w+\.\w+\.(?:net|com|gov|edu))\s-\s-\s(\[[0-9]{2}\/\w{3}\/[0-9]{4}:[0-9]{2}:[0-9]{2}:[0-9]{2}\s-[0-9]{4}\])\s(\"[^\"]+\")\s(.*)$
Проверьте https://regex101.com/r/ojIGIA/3 , чтобы увидеть его в действии и для объяснений прочитайте правую боковую панель. [1121 ]
Редактировать: я понял, что пропустил ?
в части IP-адреса регулярного выражения. Я также забыл экранировать "
, так как я не принимал во внимание вкус Python. Исправлено и обновлено регулярное выражение и ссылка.
Теперь у меня есть немного больше времени, я немного подробнее объясню, что я сделал. Вышеуказанное регулярное выражение можно разделить следующим образом.
^
начало строки
(
начало захвата группы 1
\b(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b
Это захват IP-адреса. Зависит от того, насколько точным вы хотите быть, вы можете просто сделать что-то вроде \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
, если вы не слишком беспокоитесь об этом. Это также будет соответствовать всем действительным IP-адресам, но также будет соответствовать некоторым недействительным.
|
Оператор ИЛИ
\w+\.\w+\.(?:net|com|gov|edu)
Это очень простой пример того, как может выглядеть захват URL.
)
Конец группы захвата 1
\s-\s-\s
Точно соответствует "- -"
(\[[0-9]{2}\/\w{3}\/[0-9]{4}:[0-9]{2}:[0-9]{2}:[0-9]{2}\s-[0-9]{4}\])
Это мое предложение для захвата даты и других вещей в середина. Это нужно будет настроить в зависимости от того, что именно вы хотите. Это также группа захвата 2.
\s
Пробел
(\"[^\"]+\")
Соответствует всему, что находится в кавычках в этой точке совпадения. Группа захвата 3.
\s
пробел
(.*)
Сопоставляет все остальное до конца и вводит группу захвата 4.
$
Конец строки
Теперь это всего лишь предложения, поскольку я не знаю, что именно вы пытаетесь сделать, но, надеюсь, это поможет и даст вам некоторые идеи.
Одно замечание: я использую \ s вместо пробела. В использовании пробела нет ничего плохого, лично мне нравится использовать \ s, потому что мне легче читать.
Для такой ситуации |
оператор означает или полезен, для второго примера вы можете изменить выражение на:
'([(\d\.)]+|[a-z\d\.]+) - - \[(.*?)\] "(.*?)" (\d+) (\d+)'
Обратите внимание, что это предполагает, что все адреса состоят только из строчных букв, цифр и точек , РЕДАКТИРОВАТЬ: После комментария @tripleee
я должен признать, что адреса могут содержать больше разных символов, поэтому я добавлю более терпимое решение:
'([(\d\.)]+|[^ ]+) - - \[(.*?)\] "(.*?)" (\d+) (\d+)'
этот предполагает, что адрес может содержать любой символ, который не является пробелом. Если это слишком терпимо, не стесняйтесь улучшать более раннюю версию. Как отмечено в комментариях, он является избыточным и может быть заменен на
'([^ ]+) - - \[(.*?)\] "(.*?)" (\d+) (\d+)'
. Чтобы заставить его работать с последним случаем, просто замените последний (\d+)
на (\d+|-)
, как это было предложено в @solarc
ранее