1

我想定义一个函数,它接受一个句子并返回长度至少为 4 且小写的单词。问题是,我对 Python 很陌生,我不太确定如何编写处理单词而不是整数的代码。我目前的代码如下:

def my_function(s):
    sentence = []
    for word in s.split():
        if len(word) >=4:
            return (word.lower())

如果我my_function("Bill's dog was born in 2010")希望["bill","born"]我的代码输出在哪里"bill's" 从我在 StackOverflow 和 Python 教程中看到的内容来看,正则表达式会帮助我,但我不完全理解模块中发生了什么。如果可以的话,你们能解释一下正则表达式如何提供帮助吗?

4

5 回答 5

2

您的要求略有不一致,因此我将以您的示例作为参考。

In [27]: import re

In [28]: s = "Bill's dog was born in 2010"

In [29]: [w.lower() for w in re.findall(r'\b[A-Za-z]{4,}\b', s)]
Out[29]: ['bill', 'born']

让我们看一下正则表达式,r'\b[A-Za-z]{4,}\b'.

r'...'不是正则表达式的一部分。这是一个 Python 构造,称为raw string。它就像一个普通的字符串文字,除了反斜杠序列\b没有它们通常的含义。

两者\b寻找单词边界(即单词的开头或结尾)。

查找四个或更多字母的[A-Za-z]{4,}序列。被[A-Za-z]称为字符类,由字母AthroughZathrough组成z。这{4,}是一个重复运算符,要求字符类至少匹配四次。

最后,列表[w.lower() for w in ...]推导式将单词转换为小写。

于 2013-03-04T18:50:34.863 回答
1

是的,Regex 将是实现您想要的最简单和最简单的方法。

试试这个正则表达式:

matches = re.findall(ur"\b[a-zA-Z]{4,}\b", "Put Your String Here") #matches [Your,String,Here]
于 2013-03-04T18:51:40.300 回答
0

您返回第一个 4 个字符或更长的单词,而不是所有这些单词。追加sentence并返回它:

def my_function(s):
    sentence = []
    for word in s.split():
        if len(word) >=4:
           sentence.append(word.lower())
    return sentence

您可以使用列表推导来简化它:

def my_function(s):
    return [word.lower() for word in s.split() if len(word) >= 4]

是的,正则表达式也可以做到这一点,但对于您的情况,这可能是矫枉过正。

于 2013-03-04T18:50:25.503 回答
0

您忘记在“句子”中累积长词;)您要返回第一个

于 2013-03-04T18:54:14.050 回答
0

使用 re.split

>>> import re
>>> a='Hi, how are you today?'
>>> [x for x in re.split('[^a-z]', a.lower()) if len(x)>=4]
['today']
>>> 
于 2013-03-04T21:31:48.957 回答