Regex, чтобы включить только первое столкновение "-" и "." - PullRequest
2 голосов
/ 03 июня 2019

У меня есть следующее регулярное выражение \.(?![^.]+$)|[^-0-9.], которое удаляет все символы из числа и сохраняет только первое '.'(следовательно, соответствует последнему), так как это может быть число с плавающей точкой.Однако некоторые числа также могут быть отрицательными и / или иметь знак «-», например:

-1.06581.4e-14

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

-1.06581414

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Если мы хотим заменить . и e в научных числах, это выражение может сделать это, что я добавил несколько необязательных границ, так как я не был так уверен в других входных данных:

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

Имеет 8 групп захвата со всеми отделами научного номера, которые мы можем упростить при необходимости.

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

Проверка

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"([-+]?\d+)(\.\d+)?((\.)(\d+)(e)([-+])(\d+))?"

test_str = ("-1.06581.4e-14\n"
    "1.06581.4e-14\n"
    "1.06581.4e+14\n"
    "+1.06581.4e-14\n"
    "+1.06581\n"
    "1.06\n"
    "1")

subst = "\\1\\2\\5\\8"

# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

enter image description here

Схема RegEx

jex.im визуализирует регулярные выражения:

enter image description here

Demo

Этот фрагмент кода показывает, какработа групп захвата:

const regex = /([-+]?\d+)(\.\d+)?((\.)(\d+)(e)([-+])(\d+))?/gm;
const str = `-1.06581.4e-14
1.06581.4e-14
1.06581.4e+14
+1.06581.4e-14
+1.06581
1.06
1`;
const subst = `$1$2$5$8`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log(result);
0 голосов
/ 04 июня 2019

Если вы хотите сохранить свой шаблон и хотите соответствовать последнему вхождению дефиса, вы можете добавить другое чередование |, чтобы соответствовать дефису, утверждающему, что последующее не является дефисом, использующим отрицательный взгляд (?!.*-):

\.(?![^.]+$)|[^-0-9.]|-(?!.*-)

См. Демоверсию regex

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