我需要一个关注秩序和其他一般要求的正则表达式

时间:2012-05-24 00:12:47

标签: python regex

我一直在网上搜索很多,找不到关心订单和其他一般要求的正则表达式,我的具体需求如下:

  1. 以信开头;
  2. 至少6个字符;
  3. 至少1位数。
  4. 我在python中工作,我想我知道如何为2& 3编写正则表达式但是没有找到合并1的方法,因为它涉及订单。 同样,我知道如何编写1,但没有找到一种方法将它与一般要求正则表达式结合起来(意思是括号正则表达式......不知道名字)

    对于2和3:

    ^(?=.{6,})(?=.*[\d]).*$
    

    1:

    ^[a-zA-Z].*
    

    有什么建议吗?

5 个答案:

答案 0 :(得分:7)

构建匹配A B C的“连接”表达式的一般技术是从^开始,然后将条件列为前瞻组:

^(?=A)(?=B)(?=C)

在你的情况下:

^(?=[A-Za-z])(?=.{6,})(?=\D*\d) 

关于为什么这个expr不适用于$

的问题
^(?=[A-Za-z])(?=.{6,})(?=\D*\d)$ 

这是因为它不消耗任何字符,除了虚拟的“输入开始”。当您向其附加$时,它将等同于^$,它只能匹配空字符串。

答案 1 :(得分:4)

  

我的具体需求如下:

     
      
  • 以信开头;
  •   
  • 超过6个字符;
  •   
  • 至少1位数。
  •   

不要介意正则表达式。直接测试您想要的属性。

len(x) > 6 and x[0].isalpha() and any(c.isdigit() for c in x)

答案 2 :(得分:1)

首先不假设正则表达式是解决方案。然后考虑其他可用的工具。

以字母开头:

word and word[0].isalpha()

(如果此测试在长度1之后,则可以删除word and位。)

至少六个字符:

len(word) >= 6

至少一位数字:

any(letter.isdigit() for letter in word)

但是,对于单词的长度,最后一个是O(n),如果你没有数字去找20个字符,它实际上比RE解决方案慢,因为字符串实例化;你可以反驳说,如果没有早期数字的长字符串会定期出现在这个相当冗长的版本中:

('0' in word or '1' in word or '2' in word or '3' in word or
'4' in word or '5' in word or '6' in word or '7' in word or
'8' in word or '9' in word)

然后,您可以轻松地将这些结合起来。请记住这样的事情,将它放在一个带有适当文档字符串的单独函数中;不要把魔法计算放在其他不相关的东西中。

def word_rule_check(word):
    '''
    Check that the word complies to Rule such-and-such; it must:

    1. start with a letter,
    2. be at least 6 characters long, and
    3. contain at least one digit.
    '''

    return (len(word) >= 6 and
            word[0].isalpha() and
            any(letter.isdigit() for letter in word))

答案 3 :(得分:0)

^(?=.{6,})[a-zA-Z].*\d.*$就是您所需要的。

答案 4 :(得分:0)

正则表达式在测量长度方面不是很有效,只需使用python len()即可。 至于其他两个条件,试试这个:

[a-zA-Z][a-zA-Z0-9]*[0-9][a-zA-Z0-9]*