我试图从Hackerrank的问题解决这个问题。这是一个机器学习问题。最初,我试图读取Corpus文件中用于构建单字节频率的所有单词。根据这个ML问题,word
被定义为
Word是一系列字符,仅包含
a
到z
(仅限小写)的字母,可以包含连字符(-
)和撇号('
)。 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'
。
答案 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
标志,但您提到匹配应该只是小写。