我需要编写一个脚本,用户可以输入他们的名字(通过输入),脚本必须检查名称是否具有正确的格式(没有数字,没有Capslock,以大写字母开头)。这就是我到目前为止所做的:
import re
def inputName():
name = input("Enter your name: ")
if re.search('^[A-Z]{1}\w[a-z]+',name):
print("ok")
else:
print('not ok')
inputName()
我也试过[^ \ d]和\ D和[^ 0-9],但它仍然无法正常工作。当我输入“A8hkjh”时它返回“not ok”,当我输入“Ahj8k”时它会返回“ok”,即使字符串中有一个数字。
如何让脚本检查整个字符串?
答案 0 :(得分:2)
\w
匹配字母以及数字和下划线。另外,不要忘记anchor正则表达式到字符串的末尾,否则它将在部分匹配时成功。例如,在"Ab1"
上,如果您不使用"Ab"
锚点,则子字符串$
将与您的正则表达式匹配:
re.search('^[A-Z][a-z]+$',name)
应该解决这个问题。
答案 1 :(得分:0)
import re
username = "john"
result = re.search(r'.*?(?!.*?(\d|[A-Z]))', username)
if result.groups()[0] is None:
print "{} passed validation".format(username)
正则表达式:.*?(?!.*?(\d|[A-Z]))
将匹配任何内容,只要其中没有数字或大写字母,请求。
答案 2 :(得分:0)
首先,如果要检查整个字符串,则需要锚定到字符串的开头和结尾。你有^
开头的锚点,但你应该用$
锚定到最后。你的正则表达式^[A-Z]{1}\w[a-z]+
只检查字符串的前几个字符,这就是Ahj8k返回有效的原因。这也是非常天真的,因为它不会处理诸如麦当劳",#34;史密斯 - 琼斯","杰克逊Jr。等#34;或者" de Icaza"。如果我为一个名字写一个正则表达式,我会保持简单和宽容:^[A-Za-z\.\s\-]+$
。
答案 3 :(得分:0)
你犯的错误是\ w取数字。
试试这个:regex101
这是一个非常酷的网站来测试你的正则表达式
import re
def inputName():
name = input('Enter your name: ')
if re.search("^[A-Z][a-z]+$", name):
print('ok')
else:
print("not ok")
此代码适用于:
$>输入您的姓名:Ahj8k
不行