Как использовать RegEx в операторе if в Python? - PullRequest
1 голос
/ 05 апреля 2019

Я делаю что-то вроде «Синтаксического анализатора» с Kivy, используя re (обычные выражения).

Я хочу проверить правильный синтаксис только для базовых операций (например, + | - | * | / | (|)). Пользователь связывает строку (с клавиатуры), и я проверяю ее с помощью регулярных выражений. Но я не знаю, как использовать регулярные выражения в операторе if. То, что я хочу, это: если строка, которую пользователь вводит мне, не является правильной (или не проверяет с помощью регулярного выражения), выведите что-то вроде «inavlid string» и если это правильно, выведите «Valid string».

Я пробовал с:

if re.match(patron, string) is not None:
    print ("\nTrue")
else:
    print("False")

но не имеет значения, что есть у string, приложение всегда показывает True.

Извините, мой бедный английский. Любая помощь будет принята с благодарностью!

import  re

patron= re.compile(r"""

    (
    -?\d+[.\d+]?
    [+*-/]
    -?\d+[.\d+]?
    [+|-|*|/]?
    )*
    """, re.X)

obj1= self.ids['text'].text #TextInput
if re.match(patron, obj1) is not None:
    print ("\nValid String")
else:
    print("Inavlid string")

if obj1= "53.22+22.11+10*555+62+55.2-66" на самом деле это правильно, и приложение выводит «Valid ...», но если я поставлю a как этот "a53.22+22.11+10*555+62+55.2-66", то это неправильно, и приложение должно вывести invalid.., но вместо этого оно все равно valid.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

Это ответ на ваш вопрос о том, как использовать, если с регулярным выражением:
Предостережение : формула регулярного выражения не отсеет все недопустимые входные данные, например, две десятичные точки (".."), два оператора ("++") и тому подобное. Поэтому, пожалуйста, настройте его в соответствии с вашими потребностями)

import re

regex = re.compile(r"[\d.+\-*\/]+")

input_list = [
    "53.22+22.11+10*555+62+55.2-66", "a53.22+22.11+10*555+62+55.2-66",
    "53.22+22.pq11+10*555+62+55.2-66", "53.22+22.11+10*555+62+55.2-66zz",
]

for input_str in input_list:
    mmm = regex.match(input_str)
    if mmm and input_str == mmm.group():
        print('Valid: ', input_str)
    else:
        print('Invalid: ', input_str)

Выше как функция для использования с одной строкой вместо списка:

import re
regex = re.compile(r"[\d.+\-*\/]+")

def check_for_valid_string(in_string=""):
    mmm = regex.match(in_string)
    if mmm and in_string == mmm.group():
        return 'Valid: ', in_string
    return 'Invalid: ', in_string

check_for_valid_string('53.22+22.11+10*555+62+55.2-66')
check_for_valid_string('a53.22+22.11+10*555+62+55.2-66')
check_for_valid_string('53.22+22.pq11+10*555+62+55.2-66')
check_for_valid_string('53.22+22.11+10*555+62+55.2-66zz')

Выход:

## Valid:  53.22+22.11+10*555+62+55.2-66
## Invalid:  a53.22+22.11+10*555+62+55.2-66
## Invalid:  53.22+22.pq11+10*555+62+55.2-66
## Invalid:  53.22+22.11+10*555+62+55.2-66zz
0 голосов
/ 05 апреля 2019

Ваше регулярное выражение всегда совпадает, поскольку оно позволяет сопоставить пустую строку (поскольку все регулярное выражение заключено в необязательную группу.

Если вы проверите это в прямом эфире на regex101.com , выЯ могу сразу увидеть это, а также то, что она не соответствует всей строке, а только ее части.

Я уже исправил две ошибки в ваших классах символов , касающихся использования ненужных /вредные операторы чередования (|) и неправильное размещение тире, превращая его в оператора диапазона (-), но это все равно неверно.

I думаю вам нужно что-то большеекак это:

^               # Make sure the match begins at the start of the string
(?:             # Start a non-capturing group that matches...
    -?          # an optional minus sign,
    \d+         # one or more digits
    (?:\.\d+)?  # an optional group that contains a dot and one or more digits.
    (?:         # Start of a non-capturing group that either matches...
       [+*/-]   # an operator
    |           # or
       $        # the end of the string.
    )           # End of inner non-capturing group
)+              # End of outer non-capturing group, required to match at least once.
(?<![+*/-])     # Make sure that the final character isn't an operator.
$               # Make sure that the match ends at the end of the string.

Проверьте это живите на regex101.com .

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