首页 > 解决方案 > 正则表达式:需要匹配一组字符而不匹配另一组字符

问题描述

我有两种类型的输入,

str_1 = 'rb_done_1' 
str_2 = 'rb_${4}done'

我需要正则表达式来匹配真正的只有一个。我最好的尝试是:

reg_1 = '(^[a-zA-z0-9_]+[^{}$]$)' # returns true for 1 and false for 2, this is desired output
reg_2 = '(^[a-zA-z0-9_][\${}]+$)' # returns false for both case, should return false for 1 and true for 2

^ .. $用于进行完整的字符串匹配。在 reg_2 中,我试图匹配来自'a-zA-z0-9_' 的一个或多个字符以及来自'${}' 的一个或多个字符(必须至少有一个来区分两种类型的输入)。

标签: regexpython-3.x

解决方案


关于您尝试的模式

  • 第一个模式^[a-zA-z0-9_]+[^{}$]$匹配第一个字符串,因为最后一部分[^{}$]是一个否定字符类,它将匹配除字符类中列出的任何字符之外的任何字符。

    这意味着末尾的 1rb_done_1将匹配[^{}$]

  • 第二个模式^[a-zA-z0-9_][\${}]+$不匹配两者,因为开头的字符类没有量词,但第二个有量词,这意味着字符串的第二个字符直到结尾必须是$ {或之一}

注意A-z 一样_A-Za-z


对于第一个字符串,您可以匹配 1 次以上的单词字符。

^\w+$

正则表达式演示


对于第二个字符串,您可以使用肯定的前瞻(?=来确保至少有一个 char$ {}并确保至少有一个单词字符

^(?=.*[${}])(?=.*\w)[\w${}]+$

正则表达式演示

或者使用更有效但模式稍长的否定字符类

^(?=[^${}\r\n]*[${}])(?=[^\w\r\n]*\w)[\w${}]+$

正则表达式演示


推荐阅读