Python中验证名称的最佳方法

3

我需要验证一个名称,不使用正则表达式并保持简单,我有以下代码:

def validation(name):
    for char in name:
        if  not (("A" <= char and char <= "Z") or ("a" <= char and char <= "z") or (char == " ")):
            return False
    return True

有没有办法使它变得更好?

2
为什么不用正则表达式呢?……^[a-zA-Z]$ 完成 - vks
4
强制性:程序员对姓名的错误认知。本文列出了程序员在处理姓名时可能存在的许多假设和误解,包括但不限于:人名只有一个或两个单词;名字中不会有空格、分隔符或者数字;名字按照特定顺序排列等等。了解这些常见的假设和误解,可以帮助程序员更好地设计和实现处理姓名的系统和算法。 - tobias_k
1
如果您感兴趣的话,您的逻辑可以进一步简化为 if char == ' ' or ("A" <= char <= "Z") or ("a" <= char <= "z") continue; else: return False - thiruvenkadam
4个回答

8
你需要 isalpha() 方法。
name = "oridm"
if name.replace(" ", "").isalpha():
    print "Name is valid"
else:
    print "Name is invalid"

4

有一个有用的列表string.letters,其中包含所有英文字母,因此您的代码可以写成一行:

import string

all(c in string.letters + ' ' for c in name)

这个并没有检查空格。 - Frerich Raabe
@FrerichRaabe,它确实需要注意 + ' ' - myaut
@FrerichRaabe 字符串中的空格可以出现在任何位置,数量也可以是任意的。例如,“John Doe”= True,同样适用于“John D o e”和“JohnDoe”。 - Chef1075

2
import re 
pattern = re.compile(r'([a-zA-Z])\D*([a-zA-Z])$')
pattern.search('string you're searching')

这个 - 或者类似的东西 - 将允许您解析字符串。它查找第一个字符串,然后忽略非数字的可选分隔符(\D*),然后是最终的字符串。


@myaut是更好的答案。 - Chef1075
你在compile方法中漏掉了引号;同时也要移除pattern.search中的= :-) - thiruvenkadam

1
import re

def validate_user(username, minlen):
"""Checks if the received username matches the required conditions."""
if type(username) != str:
    raise TypeError("username must be a string")
if minlen < 1:
    raise ValueError("minlen must be at least 1")

# Usernames can't be shorter than minlen
if len(username) < minlen:
    return False
# Usernames can only use letters, numbers, dots and underscores
if not re.match('^[a-z0-9._]*$', username):
    return False
# Usernames can't begin with a number
if username[0].isnumeric():
    return False
return True

1
OP明确表示不使用正则表达式,这意味着这不是一个有效的答案。请您修复缩进。 - Timus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接