验证正则表达式中的单点和空格

dah*_*boy 2 python regex python-3.x

我正在尝试在以下条件下验证姓名

  1. 第一个和最后一个字符应为字母,并且在开头和结尾都不能有空格。
  2. 如果有任何点,那么应该有一个空格。名称最多可以包含1个点和1个空格。
  3. 字长应为5,20。

代码工作:

    def check(word):
        matchObj = re.match( r'^(([^ ]?)(^[a-zA-Z]).*([a-zA-Z]$)([^ ]?))$', word, re.M|re.I)
        if matchObj:
            return True
        else:
            return False
Run Code Online (Sandbox Code Playgroud)

我能够做到第一点,但无法理解如何做到第二点。关于第三点,我{5,20}在最后$一个正则表达式之前尝试过,但是它不起作用。

从上面的正则表达式中,我要验证-杰克逊-杰克逊博士

并使以下内容无效:-杰克逊博士#(。)后两个空格-杰克逊博士#包含两个点

希望以上你能解决我的问题。

anu*_*ava 5

您可以将此正则表达式与前瞻性断言一起使用:

(?mi)^[a-z](?!(?:.*\.){2})(?!(?:.* ){2})(?!.*\.[a-z])[a-z. ]{3,18}[a-z]$
Run Code Online (Sandbox Code Playgroud)

正则演示

正则表达式详细信息:

  • (?mi):启用MULTILINE和IGNORE_CASE模式
  • ^:开始
  • [a-z]:开头匹配一个字母
  • (?!(?:.*\.){2}):负向前瞻性断言我们只有一个点
  • (?!(?:.* ){2}):否定前瞻断言我们没有太多空间
  • (?!.*\.[a-z]):负前瞻性断言,如果我们有一个点,则其后不跟字母
  • [a-z. ]{3,18}:匹配3至18个给定字符,使总长度为5至20
  • [a-z]:在结尾前匹配一个字母
  • $: 结束