如何只匹配特定字符?

时间:2014-02-21 10:03:39

标签: python regex

这里我尝试匹配字符串中的特定字符

^[23]*$ 

这是我的案例,

  1. 2233 - >的匹配
  2. 22 - >不匹配
  3. 33 - >不匹配
  4. 2435 - >不匹配
  5. 2322 - >的匹配
  6. 323 - >的匹配
  7. 我希望将字符串与正确的正则表达式匹配。我的意思是需要1,5,6个案例。

    更新

    如果我有两个以上的数字匹配,就像模式一样,

    23443或者等等。如何将此模式与任何字符串匹配?。

    我想要动态匹配?

6 个答案:

答案 0 :(得分:7)

怎么样:

(2+3|3+2)[23]*$

字符串必须:

  • 从一个或多个2开始,包含3,然后是2或3的任何混合
  • 以一个或多个3开头,包含2,然后是2或3的任何混合

更新:参数化模式

要参数化此模式,您可以执行以下操作:

x = 2
y = 3
pat = re.compile("(%s+%s|%s+%s)[%s%s]*$" % (x,y,y,x,x,y))
pat.match('2233')

或更清晰,但更长:

pat = re.compile("({x}+{y}|{y}+{x})[{x}{y}]*$".format(x=2, y=3))

或者您可以使用Python template strings

更新:处理两个以上的字符:

如果要测试的字符超过两个,则正则表达式变得笨拙,我的其他答案变得更容易:

def match(s,ch):
    return all([c in s for c in ch]) and len(s.translate(None,ch)) == 0

match('223344','234') # True
match('2233445, '234') # False

另一次更新:使用套件

我对上述解决方案并不完全满意,因为它似乎有点特别。最终我意识到这只是一个集合比较 - 我们只想检查输入是否由一组固定的字符组成:

def match(s,ch):
    return set(s) == set(ch)

答案 1 :(得分:3)

如果你想匹配包含2和3的字符串,但没有其他字符,你可以使用前瞻和你已经拥有的东西:

^(?=.*2)(?=.*3)[23]*$

前瞻(?=.*2)(?=.*3)声明存在2和3,而^[23]*$仅将实际字符串与这两个字符匹配。

答案 2 :(得分:2)

我知道您要求使用正则表达式(我已发布)的解决方案,但这是另一种方法:

def match(s):
  return '2' in s and '3' in s and len(s.translate(None,'23')) == 0

我们检查字符串是否包含所需的字符,然后将它们翻译成空字符串,然后检查没有剩下的字符串(即我们只有有2和3)。

使用all函数和列表理解,可以轻松扩展此方法以处理两个以上的字符:

def match(s,ch):
    return all([c in s for c in ch]) and len(s.translate(None,ch)) == 0

将使用如下:

match('223344','234') # True
match('2233445, '234') # False

答案 3 :(得分:0)

试试这个:( 2和3都应该存在)

^([2]+[3]+[23]*)|([3]+[2]+[23]*)$

答案 4 :(得分:0)

^(2[23]*3[23]*)|(3[23]*2[23]*)$

我认为这样做会。在开始时寻找2,然后在某处出现3(根据需要被其他2和3包围)。反之亦然,一开始是3,另一个是2。

答案 5 :(得分:0)

应以2或3开头,然后2或更多次出现2或3

    ^[23][23]{2,}$