! является логическим оператором NOT, это логический оператор, который будет инвертировать что-то противоположное.
Хотя вы можете обойти круглые скобки вызываемой функции, используя функцию BANG (!) перед функцией, она все равно инвертирует возврат, который может быть не таким, каким вы хотели. Как и в случае с IEFE, он возвращает undefined , который при инвертировании становится логическим значением true.
Вместо этого используйте закрывающую скобку и BANG (!) если нужно.
blockquote>// 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
Другие операторы, которые работают ...
blockquote>+(function(){ return false; }()); => 0 -(function(){ return false; }()); => -0 ~(function(){ return false; }()); => -1
Комбинированные операторы ...
blockquote>+!(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
Я бы выделил его в другую группу захвата следующим образом:
(?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')
и т. Д.
(5G|4G)\sDL\s(\d*[.]?\d*)\sUP\s(\d*[.]?\d*)
с флагами gi (глобальные, без учета регистра) должны работать. Вы можете изменить сопоставление цифр, так как я не уверен, обязательно ли это десятичное число или нет.
Я согласен с ответами, которые говорят об использовании групп захвата, но имеют немного другой подход к самому регулярному выражению. Обязательно используйте параметры 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.