为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Python 的 if 语句中使用 RegEx?

如何在 Python 的 if 语句中使用 RegEx?

守着星空守着你 2021-12-29 18:19:28
我正在做类似“语法分析器”的事情Kivy,使用re(正则表达式)。我只想检查基本操作的有效语法(如 +|-|*|/|(|))。用户将字符串(使用键盘)粘贴起来,然后我使用正则表达式对其进行验证。但我不知道如何在 if 语句中使用正则表达式。我想要的是:如果用户带给我的字符串不正确(或未使用正则表达式检查),则打印“inavlid string”之类的内容,如果正确则打印“Valid string”。我试过:if re.match(patron, string) is not None:    print ("\nTrue")else:    print("False")但是,不管做什么string,应用程序总是显示True.对不起,我的英语不好。任何帮助将不胜感激!import  repatron= re.compile(r"""    (    -?\d+[.\d+]?    [+*-/]    -?\d+[.\d+]?    [+|-|*|/]?    )*    """, re.X)obj1= self.ids['text'].text #TextInputif 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"实际上它是正确的并且应用程序打印“有效...”但是如果我a像这样输入"a53.22+22.11+10*555+62+55.2-66"它是不正确的并且应用程序必须打印invalid..但它仍然是valid。
查看完整描述

2 回答

?
MM们

TA贡献1886条经验 获得超2个赞

您的正则表达式始终匹配,因为它允许空字符串匹配(因为整个正则表达式都包含在一个可选组中。


如果您在 regex101.com 上对此进行实时测试,您可以立即看到这一点,并且它不匹配整个字符串,而只匹配其中的一部分。


我已经更正了字符类中关于使用不必要/有害的交替运算符 ( |) 和不正确放置破折号的两个错误,使其成为范围运算符 ( -),但它仍然不正确。


我想你想要更像这样的东西:


^               # 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.


查看完整回答
反对 回复 2021-12-29
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

这回答了您关于如何将 if 与 regex 一起使用的问题:

注意:regex 公式不会清除所有无效输入,例如,两个小数点 ("..")、两个运算符 ("++") 等。所以请调整它以满足您的确切需求)


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


查看完整回答
反对 回复 2021-12-29
  • 2 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信