0

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

  1. 以字母开头;
  2. 至少6个字符;
  3. 至少 1 位数。

我在 python 中工作,我想我知道如何为 2&3 编写正则表达式,但没有找到组合 1 的方法,因为它涉及顺序。同样,我知道如何写 1 但没有找到将其与一般要求正则表达式结合的方法(意思是括号正则表达式......不知道名称)

对于 2 和 3:

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

对于 1:

^[a-zA-Z].*

有什么建议么?

4

5 回答 5

7

构建匹配 ABC 的“合取”表达式的一般技术是从条件开始,^然后将条件列为前瞻组:

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

在你的情况下:

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

至于为什么这个 expr 不起作用的问题$

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

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

于 2012-05-24T00:24:17.573 回答
4

我的具体需求如下:

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

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

len(x) > 6 and x[0].isalpha() and any(c.isdigit() for c in x)
于 2012-05-24T00:24:53.510 回答
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))
于 2012-05-24T00:25:12.963 回答
0

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

于 2012-05-24T00:23:55.420 回答
0

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

[a-zA-Z][a-zA-Z0-9]*[0-9][a-zA-Z0-9]*
于 2012-05-24T01:43:14.210 回答