12

我正在尝试将此字符串格式化为一行包含五个单词的下方。但是,我一直将其作为输出:

我喜欢饼干,是的,我喜欢让我们看看狗

首先,我不是一行中有 5 个单词,而是一行中的所有内容。

第二,为什么“让我们”会分裂?我想在使用“单词”拆分字符串时,只有在中间有空格时才会拆分?

建议?

string = """I love cookies. yes I do. Let's see a dog."""


# split string
words = re.split('\W+',string)

words = [i for i in words if i != '']


counter = 0
output=''
for i in words:
    if counter == 0:
        output +="{0:>15s}".format(i)

# if counter == 5, new row
    elif counter % 5 == 0:
       output += '\n'
       output += "{0:>15s}".format(i)

    else:
       output += "{0:>15s}".format(i)

    # Increase the counter by 1
    counter += 1

print(output)
4

2 回答 2

20

首先,不要调用变量“字符串”,因为它会影响同名模块

其次,split()用来做你的分词

>>> s = """I love cookies. yes I do. Let's see a dog."""
>>> s.split()
['I', 'love', 'cookies.', 'yes', 'I', 'do.', "Let's", 'see', 'a', 'dog.']

重新模块

\W 匹配任何不是 Unicode 字字符的字符。这与 \w 正好相反。如果使用 ASCII 标志,则它等效于 [^a-zA-Z0-9_](但标志会影响整个正则表达式,因此在这种情况下使用显式 [^a-zA-Z0-9_] 可能是更好的选择)。

由于'上面没有列出,所以使用的正则表达式将“Let's”字符串分成两部分:

>>> words = re.split('\W+', s)
>>> words
['I', 'love', 'cookies', 'yes', 'I', 'do', 'Let', 's', 'see', 'a', 'dog', '']

这是我使用上面的 strip() 方法得到的输出:

$ ./sp3.py 
              I           love       cookies.            yes              I
            do.          Let's            see              a           dog.

代码可能可以简化为这个counter==0,因为 else 子句做同样的事情。我也通过枚举来摆脱计数器:

#!/usr/bin/env python3

s = """I love cookies. yes I do. Let's see a dog."""
words = s.split()

output = ''
for n, i in enumerate(words):
    if n % 5 == 0:
        output += '\n'
    output += "{0:>15s}".format(i)
print(output)
于 2013-06-20T19:41:34.600 回答
1
words = string.split()
while (len(words))
     for word in words[:5]
          print(word, end=" ")
     print()
     words = words[5:]

这是基本概念,使用 split() 方法将其拆分

然后使用切片表示法对其进行切片以获取前 5 个单词

然后切掉前 5 个单词,再次循环

于 2013-06-20T19:45:15.167 回答