Python re.search()和re.findall()

时间:2013-11-27 13:49:18

标签: python regex python-2.7 regex-greedy

我试图从Hackerrank的问题解决这个问题。这是一个机器学习问题。最初,我试图读取Corpus文件中用于构建单字节频率的所有单词。根据这个ML问题,word被定义为

  

Word是一系列字符,仅包含az(仅限小写)的字母,可以包含连字符(-)和撇号(')。 Word应该以小写字母开头和结尾。

我在python中写了一个正则表达式:

pat = "[a-z]+( ['-]+[a-z]+ ){0,}"

我尝试同时使用re.search()re.findall()。我两个都有问题。

  • re.findall()的问题:

    string = "HELLO W-O-R-L-D"
    

    re.findall()的输出:

    [('Hello', ''), ('W', '-D')]
    

    我无法得到W-O-R-L-D这个词。使用re.search()时,我能够正确使用

  • re.search()的问题:

    string = "123hello456world789"
    

    re.search()的输出:

    'hello'
    

    在这种情况下,使用re.findall()时,我可以同时获得'hello''world'

1 个答案:

答案 0 :(得分:4)

作为I posted on your previous question,您应该使用re.findall() - 但无论如何,您的问题是您的正则表达式是错误的。请参阅以下示例:

>>> import re
>>> regex = re.compile(r'([a-z][a-z-\']+[a-z])')
>>> regex.findall("HELLO W-O-R-L-D") # this has uppercase
[]  # there are no results here, because the string is uppercase
>>> regex.findall("HELLO W-O-R-L-D".lower()) # lets lowercase
['hello', 'w-o-r-l-d'] # now we have results
>>> regex.findall("123hello456world789")
['hello', 'world']

正如您所看到的,您提供的第一个示例失败的原因是因为大写,您可以简单地添加re.IGNORECASE标志,但您提到匹配应该只是小写。