这里我尝试匹配字符串中的特定字符
^[23]*$
这是我的案例,
2233
- >的匹配 22
- >不匹配33
- >不匹配2435
- >不匹配2322
- >的匹配 323
- >的匹配 我希望将字符串与正确的正则表达式匹配。我的意思是需要1,5,6个案例。
更新
如果我有两个以上的数字匹配,就像模式一样,
234
或43
或者等等。如何将此模式与任何字符串匹配?。
我想要动态匹配?
答案 0 :(得分:7)
怎么样:
(2+3|3+2)[23]*$
字符串必须:
更新:参数化模式
要参数化此模式,您可以执行以下操作:
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,}$