Regex, чтобы получить ключевые слова, все цифры и точки

! является логическим оператором NOT, это логический оператор, который будет инвертировать что-то противоположное.

Хотя вы можете обойти круглые скобки вызываемой функции, используя функцию BANG (!) перед функцией, она все равно инвертирует возврат, который может быть не таким, каким вы хотели. Как и в случае с IEFE, он возвращает undefined , который при инвертировании становится логическим значением true.

Вместо этого используйте закрывающую скобку и BANG (!) если нужно.

// I'm going to leave the closing () in all examples as invoking the function with just ! and () takes away from what's happening.

(function(){ return false; }());
=> false

!(function(){ return false; }());
=> true

!!(function(){ return false; }());
=> false

!!!(function(){ return false; }());
=> true

Другие операторы, которые работают ...

+(function(){ return false; }());
=> 0

-(function(){ return false; }());
=> -0

~(function(){ return false; }());
=> -1

Комбинированные операторы ...

+!(function(){ return false; }());
=> 1

-!(function(){ return false; }());
=> -1

!+(function(){ return false; }());
=> true

!-(function(){ return false; }());
=> true

~!(function(){ return false; }());
=> -2

~!!(function(){ return false; }());
=> -1

+~(function(){ return false; }());
+> -1
0
задан trystuff 18 March 2019 в 18:58
поделиться

3 ответа

Я бы выделил его в другую группу захвата следующим образом:

(?i)(?P<g1>5?4?G)\sDL\s(?P<g2>[^\s]*)\sUP\s(?P<g3>[^\s]*)

(?i) делает все регулярное выражение нечувствительным к регистру

(?P<g1>5?4?G) является первым сопоставление групп на 4g, 5g, 4G или 5G.

(?P<g2>[^\s]*) - вторая и третья группы, совпадающие по всему, что не является пробелом.

Затем в Python вы можете сделать:

match = re.match('(?i)(?P<g1>5?4?G)\sDL\s(?P<g2>[^\s]*)\sUP\s(?P<g3>[^\s]*)', input)

И получить доступ к каждой группе следующим образом:

match.group('g1') и т. Д.

0
ответ дан Hans Daigle 18 March 2019 в 18:58
поделиться
(5G|4G)\sDL\s(\d*[.]?\d*)\sUP\s(\d*[.]?\d*)

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

0
ответ дан MonoHearted 18 March 2019 в 18:58
поделиться

Я согласен с ответами, которые говорят об использовании групп захвата, но имеют немного другой подход к самому регулярному выражению. Обязательно используйте параметры gi (глобальные и без учета регистра), чтобы получить правильные результаты.

r"([45]G).*?([\d.]+).*?([\d.]+)"

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

import re

regex = r"([45]G).*?([\d.]+).*?([\d.]+)"

test_str = "Put in 3 extenders but by the 4th floor it is weak on signal these don't piggy back of each other. ST -99. 5G DL 624.26 UP 168.20 4g DL 2 Up .44"

matches = re.finditer(regex, test_str, re.IGNORECASE)

for matchNum, match in enumerate(matches, start=1):

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1

        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.
0
ответ дан saritonin 18 March 2019 в 18:58
поделиться
Другие вопросы по тегам:

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