Python正则表达式未返回预期值

2024-09-25 06:22:17 发布

您现在位置:Python中文网/ 问答频道 /正文

问题:

给定一个词,你需要判断它中大写字母的用法是否正确。你知道吗

当下列情况之一成立时,我们将单词中大写字母的用法定义为正确:

这个词中的所有字母都是大写,像“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

我做错什么了?你知道吗


Tags: re用法定义value字母大写字母单词word
3条回答

让我们保持简单:您可以通过要求它匹配整个字符串来修复您的解决方案,这就是您的意思:r"^([A-Z]*|[A-Z]?[a-z]*)$"将按照您的预期工作。你知道吗

您遇到的问题与这样一个事实有关:这个regex [A-Z]*开始匹配,然后在完成类似Flag的情况之前停止。尝试通过要求[A-Z]匹配至少两个或更多的字母来解决这个问题。试试这个正则表达式:

[A-Z]{2,}|[A-Z]?[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,})$

相关问题 更多 >