📌  相关文章
📜  如何使用Python检查有效的正则表达式字符串?

📅  最后修改于: 2022-05-13 01:55:13.552000             🧑  作者: Mango

如何使用Python检查有效的正则表达式字符串?

正则表达式(正则表达式是用于定义模式的字符序列。该模式可用于搜索、替换等操作。 Regex 广泛用于需要输入验证、密码验证、模式识别、搜索和替换实用程序(在文字处理器中找到)等的应用程序。这是因为 regex 语法在不同的编程语言和实现中保持相同。因此,掌握它可以提供跨语言的寿命。在本文中,我们将创建一个程序来检查正则表达式字符串的有效性。

我们将使用的方法需要对Python的try-except结构有深刻的理解。因此,如果我们在转到实际代码之前先触及它,那将是明智的。

异常处理

Try except 块用于捕获和处理在执行特定代码块期间遇到的异常(结构存在于其他编程语言中,名称为try-catch )。 try-except块的一般语法如下:

在上面的语法中,在 try 块中找到的任何代码都将被执行。如果在执行 try 块期间出现异常/错误,则(仅)执行 except 块。如果 try 块在没有产生异常的情况下执行,则不会执行 except 块。如果使用了一个空的 except 子句,那么它将捕获在 try 块执行期间遇到的任何异常(甚至某些System_Exits )。为了防止这种情况发生,在except之后指定一个异常通常是一个很好的做法。这确保只有在遇到特定的异常/错误后,except 块才会执行。这可以防止隐藏在执行 try 块期间遇到的其他错误。此外,可以在同一个 try-except 块中使用多个 except 子句,这使其能够捕获大量异常,并专门处理它们。该构造还包含其他关键字,例如finally、else 等,这些关键字在当前上下文中是不需要的。因此,仅描述相关部分。

代码:

在下面的代码中,我们将在 try-except 块的 except 子句中指定re.error作为异常。在编译模式期间发现无效的正则表达式模式时会遇到此错误。

Python3
import re
  
  
# pattern is a string containing the regex pattern
pattern = r"[.*"
  
try:
    re.compile(pattern)
  
except re.error:
    print("Non valid regex pattern")
    exit()


Python3
import re
  
# compiling the pattern for alphanumeric string
pat = re.compile(r"[A-Za-z0-9]+")
  
# Prompts the user for input string
test = input("Enter the string: ")
  
# Checks whether the whole string matches the re.pattern or not
if re.fullmatch(pat, test):
    print(f"'{test}' is an alphanumeric string!")
else:
    print(f"'{test}' is NOT a alphanumeric string!")


输出
Non valid regex pattern

解释:

首先,我们导入了 re 库,用于在我们的代码中启用正则表达式功能。然后我们将一个包含正则表达式模式的字符串分配给变量模式。提供的模式无效,因为它包含未封闭的字符类(在正则表达式方括号中`[ ]` 用于定义字符类)。我们将re.compile() (用于编译正则表达式模式)函数放在 try 块中。这将首先尝试编译模式,如果在编译过程中发生任何异常,它会首先检查它是否是re.error ,如果是则只执行 except 块。否则会在回溯中显示异常,导致程序终止。 except 块包含打印语句,将用户定义的消息输出到标准输出,然后退出程序(通过exit() )。由于提供的模式无效(之前解释过),这会导致执行 except 块。

笔记:

上面的代码只处理re.error异常。但是其他与正则表达式相关的异常也存在,例如RecursionError ,需要专门处理(通过为该异常添加单独的 except 子句或使用sys.setrecursionlimit()在这种情况下更改最大堆栈深度)。

检查输入字符串是否与 Regex 模式匹配

在下面的示例中,我们将测试输入字符串是否与给定的正则表达式模式匹配。这是假设正则表达式模式是有效的(可以使用上述示例确保)。我们将检查输入字符串是否为字母数字字符串(整个长度包含字母或数字的字符串)。我们将使用以下类来检查字符串:

^[A-Za-z0-9]+$

即使在正则表达式 ( \w ) 中存在用于查找字母数字字符的特殊序列。但是我们不会使用它,因为它在其字符类 (A-Za-z0-9 _ ) 中包含下划线 ( _ ),在大多数标准下它不被视为字母数字字符。

代码:

蟒蛇3

import re
  
# compiling the pattern for alphanumeric string
pat = re.compile(r"[A-Za-z0-9]+")
  
# Prompts the user for input string
test = input("Enter the string: ")
  
# Checks whether the whole string matches the re.pattern or not
if re.fullmatch(pat, test):
    print(f"'{test}' is an alphanumeric string!")
else:
    print(f"'{test}' is NOT a alphanumeric string!")

输出:

> Enter the string: DeepLearnedSupaSampling01
  'DeepLearnedSupaSampling01' is an alphanumeric string!
> Enter the string: afore 89df
  'afore 89df' is NOT a alphanumeric string!

解释:

首先,我们使用re.compile()编译正则表达式模式。 Regex 模式包含一个字符集,用于指定所有字母(小写和大写)和数字 (0-9) 都包含在该模式中。类后面是加号 ( + ),它是一个重复限定符。这允许生成的正则表达式搜索匹配前面正则表达式的 1 次或多次重复(对我们来说,这是字母数字字符集)。然后我们提示用户输入字符串。之后我们将输入字符串和编译的正则表达式模式传递给re.fullmatch() 。此方法检查整个字符串是否与正则表达式模式匹配。如果是,则返回 1,否则返回 0。我们在if-else构造中使用它来相应地显示成功/失败消息。