Python:使用re.match检查字符串

时间:2017-09-19 20:11:23

标签: python regex

我需要编写func来检查str。如果适合下一个条件:

1)str应以字母 - ^[a-zA-Z]

开头

2)str可能包含字母,数字,一个.和一个-

3)str应以字母或数字结尾

4)str的长度应为1至50

def check_login(str):
    flag = False
    if match(r'^[a-zA-Z][a-zA-Z0-9.-]{1,50}[a-zA-Z0-9]$', str):
        flag = True
    return flag

但它应该意味着它以字母开头,[a-zA-Z0-9.-]的长度大于0且小于51,它以[a-zA-Z0-9]结束。 如何限制.-的数量并将长度限制写入所有表达式?

我的意思是a - 应该返回true,qwe123也是真的。

我该如何解决?

1 个答案:

答案 0 :(得分:2)

你需要前瞻:

^                              # start of string
    (?=^[^.]*\.?[^.]*$)        # not a dot, 0+ times, a dot eventually, not a dot
    (?=^[^-]*-?[^-]*$)         # same with dash
    (?=.*[A-Za-z0-9]$)         # [A-Za-z0-9] in the end
    [A-Za-z][-.A-Za-z0-9]{,49} 
$

请参阅a demo on regex101.com

<小时/> 在Python中可能是:

import re

rx = re.compile(r'''
^                        # start of string
    (?=^[^.]*\.?[^.]*$)  # not a dot, 0+ times, a dot eventually, not a dot
    (?=^[^-]*-?[^-]*$)   # same with dash
    (?=.*[A-Za-z0-9]$)   # [A-Za-z0-9] in the end
    [A-Za-z][-.A-Za-z0-9]{,49} 
$
''', re.VERBOSE)

strings = ['qwe123', 'qwe-123', 'qwe.123', 'qwe-.-123', '123-']

def check_login(string):
    if rx.search(string):
        return True
    return False

for string in strings:
    print("String: {}, Result: {}".format(string, check_login(string)))

这会产生:

String: qwe123, Result: True
String: qwe-123, Result: True
String: qwe.123, Result: True
String: qwe-.-123, Result: False
String: 123-, Result: False