Как улучшить это регулярное выражение для работы в других ситуациях?

Если допустимо печатать как 1.d1d2d3d4d5 ... * 2 ^ e1e2e3, то преобразование числа с плавающей запятой в десятичное (-ish) представление может быть простым. Реализация может быть найдена здесь .

Если вам нужно научное представление 1.d1d2 ... * 10 ^ e1e2e3, тогда наивный подход к многократному делению на 10 и извлечению цифр из номер, который у вас есть в формате с плавающей запятой. Вам понадобится какая-то многоцелевая целочисленная библиотека. (Повторно умножить на 10, чтобы извлечь цифры после точки.)

0
задан Michel Excel 16 January 2019 в 16:43
поделиться

2 ответа

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

^(\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, потому что мне легче читать.

0
ответ дан JackPRead 16 January 2019 в 16:43
поделиться

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

'([(\d\.)]+|[a-z\d\.]+) - - \[(.*?)\] "(.*?)" (\d+) (\d+)'

Обратите внимание, что это предполагает, что все адреса состоят только из строчных букв, цифр и точек , РЕДАКТИРОВАТЬ: После комментария @tripleee я должен признать, что адреса могут содержать больше разных символов, поэтому я добавлю более терпимое решение:

'([(\d\.)]+|[^ ]+) - - \[(.*?)\] "(.*?)" (\d+) (\d+)'

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

'([^ ]+) - - \[(.*?)\] "(.*?)" (\d+) (\d+)'

. Чтобы заставить его работать с последним случаем, просто замените последний (\d+) на (\d+|-), как это было предложено в @solarc ранее

.
0
ответ дан Daweo 16 January 2019 в 16:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: