我想检查用户输入的字符串(如'hello')是否只包含一个单词而不包含任何其他单词。仅适用于那些只包含[a-zA-Z]并且没有空格或点或下划线或其他单词的情况。
例如:
'hello' true
'hello_' false
'hello world' false
'h.e.l.l.o' false
我不知道怎么写正则表达式。需要帮助。
答案 0 :(得分:3)
这里没有必要写一个正则表达式。这已经在Python中内置str.isalpha
:
如果字符串中的所有字符都是字母字符且至少有一个字符,则返回
True
,否则为False
。
所以我们可以查看:
if your_string.isalpha():
pass
但请注意:
注意:
str.isalpha
还包含变音符号等。例如:>>> 'ä'.isalpha() True
这不是本身的一个问题。但它可能是需要考虑的因素。
如果您不想要diacricics,您可以检查所有字符的ord(..)
是否小于128:
if your_string.isalpha() and all(ord(c) < 128 for c in your_string):
pass
使用内置函数的优点是这些更自我解释(isalpha()
清楚地表明它在做什么),而且它不太可能包含任何错误(我不是说其他方法 包含错误,但是自己编写一些东西,通常意味着它没有经过有效测试,因此它仍然无法完全覆盖 edge 和 corner 情况。
答案 1 :(得分:1)
您可以使用主播^
和$
:
import re
s = "hello"
if re.findall('^[a-zA-Z]+$', s):
pass #string condition met
re.findall
和re.search
之间的效果比较:
import timeit
s1 = """
import re
re.findall('^[a-zA-Z]+$', 'hello')
"""
print(timeit.timeit(stmt=s1,number=10000))
>>> 0.0147941112518
s2 = """
import re
re.match('^[a-zA-Z]+$', 'hello')
"""
print(timeit.timeit(stmt=s2,number=10000))
>>> 0.0134868621826
虽然re.match
的效果略好于re.findall
,但我更喜欢re.findall
,因为1)最初查看结果更容易,2)立即将结果存储在列表中。