问题:
给定一个词,你需要判断它中大写字母的用法是否正确。你知道吗
当下列情况之一成立时,我们将单词中大写字母的用法定义为正确:
这个词中的所有字母都是大写,像“USA”。 这个词中的所有字母都不是大写的,比如“leetcode”。 只有在这个单词的第一个字母是大写的,如果它有一个以上的字母,如“谷歌”。 否则,我们定义这个词不正确地使用大写字母。你知道吗
我的解决方案(使用regex库)
进口re
def detectCapitalUse(word):
pattern = r'[A-Z]*|[A-Z]?[a-z]*'
r = re.search(pattern, word)
print r.group()
模式的前半部分[A-Z]*
应该匹配所有大写字母,或者第二部分[A-Z]?[a-z]*
应该匹配任何以一个大写字母开头,其余为小写字母的单词,或者只匹配一个小写字母的单词。你知道吗
当我编写以下测试用例时,我得到了意想不到的答案
detectCapitalUse("Flag") Expected: Flag Actual Value: F
detectCapitalUse("flag") Expected: flag Actual Value: Empty string
我做错什么了?你知道吗
让我们保持简单:您可以通过要求它匹配整个字符串来修复您的解决方案,这就是您的意思:
r"^([A-Z]*|[A-Z]?[a-z]*)$"
将按照您的预期工作。你知道吗您遇到的问题与这样一个事实有关:这个regex
[A-Z]*
开始匹配,然后在完成类似Flag
的情况之前停止。尝试通过要求[A-Z]
匹配至少两个或更多的字母来解决这个问题。试试这个正则表达式:演示:https://regex101.com/r/H2ExoN/1/
让我们先考虑第一个要求:所有字母都是大写的。回想一下,
*
匹配零次或多次,因此可以很好地匹配空字符串。这就解释了你上面的第二个意外案例。还要注意re.search()
匹配字符串中的任何位置,因此需要从head和tail中排除非大写。一种方法是根据模式的开始和结束进行匹配,并设置最小匹配计数以排除空字符串:^[A-Z]{1,}$
(请注意,这也将匹配单个大写字母。)
同样的考虑也适用于你的第二个案例。所以你的组合模式是:
^[A-Z]{1,}$|^[A-Z]?[a-z]{1,}$
或者:
^([A-Z]{1,}|[A-Z]?[a-z]{1,})$
相关问题 更多 >
编程相关推荐