替换字符串中的每个第二个字符

时间:2018-05-05 08:43:26

标签: python

我正在尝试构建一个程序,它将从列表中选择一个随机单词,并显示替换字母替换为连字符的单词。例如,单词“monkey”将显示为“-o-k-y”。 我可以使用random.choice轻松选择一个随机单词,我知道我应该使用FOR循环,但我似乎无法理解它。

5 个答案:

答案 0 :(得分:3)

有一种方法可以在不使用显式循环或正则表达式的情况下执行此任务,只需使用内置的str方法。这有点棘手,所以我会解释它是如何分阶段运作的。

首先,我们可以使用扩展切片表示法获取序列中的每个第2项。这通常用于列表或元组,但它也适用于字符串。例如,

>>> 'abcdef'[::2]
'ace'
>>> 'abcdefg'[::2]
'aceg'
>>> 'abcdefg'[1::2]
'bdf'

我们可以使用str.join方法将一系列字符连接在一起。我们称之为.join的字符串用作arg中.join项之间的分隔符。这主要用于将一系列字符串连接在一起,但它也适用于单个字符串。例如,

>>> '-'.join('abcdef')
'a-b-c-d-e-f'
>>> '-*-'.join('abcdef')
'a-*-b-*-c-*-d-*-e-*-f'

另一种对此任务有用的方法是str.ljust。此方法允许我们使用我们选择的字符将字符串填充到给定长度(默认填充字符是ASCII空格)。原始字符转到输出字符串的左侧,填充添加到右侧。如果字符串长于请求的长度,则不加修改地返回。

>>> 'abcd'.ljust(6, '-')
'abcd--'
>>> 'abcdef'.ljust(4, '-')
'abcdef'

我们可以使用这些工具执行您想要的字符串转换。

>>> 'monkey'[1::2]
'oky'
>>> '-'.join('monkey'[1::2])
'o-k-y'
>>> '-' + '-'.join('monkey'[1::2])
'-o-k-y'

到目前为止,这么好。但是,当单词的长度为奇数时,它就不能正常工作:

>>> '-' + '-'.join('gorilla'[1::2])
'-o-i-l'

那应该是最后一击。但我们可以使用.ljust来解决这个问题:

>>> word = 'gorilla'
>>> s = '-' + '-'.join(word[1::2])
>>> s.ljust(len(word), '-')
'-o-i-l-'

让我们用几个不同的词来测试它。

words = 'Here are some short test words monkey gorilla'.split()
for word in words:
    dashed = ('-' + '-'.join(word[1::2])).ljust(len(word), '-')
    print(word, dashed)

<强> 输出

Here -e-e
are -r-
some -o-e
short -h-r-
test -e-t
words -o-d-
monkey -o-k-y
gorilla -o-i-l-

Jon Clements指出我们可以在这里使用str.replace方法的无法记录的功能。如果你传递一个空字符串作为它的第一个arg,它将在旧字符串的每个位置插入替换字符串。例如:

>>> 'abcdef'.replace('', '-')
'-a-b-c-d-e-f-'

我们可以使用该未记录的功能来执行您的任务:

words = 'Here are some short test words monkey gorilla'.split()
for word in words:
    dashed = word[1::2].replace('', '-')[:len(word)]
    print(word, dashed)

输出与以前的版本相同,但Jon的代码几乎是我的版本的两倍。谢谢,乔恩!

我在Python 2.5,2.6,3.1和3.6上测试了这个代码,它运行得很好,但请记住,使用未记录的功能通常是一个好主意,因为它们可以更改没有通知。

答案 1 :(得分:2)

您可以使用正则表达式:

import re
word = re.sub(r'.(.)', r'-\1', "monkey")

答案 2 :(得分:1)

使用生成器表达式替换偶数索引处的字符:

>>> s
'Hello, world!'

>>> ''.join(c if i%2 else '-' for i, c in enumerate(s))
'-e-l-,-w-r-d-'

如果您希望连字符模式是随机的,可以使用random.sample() range(len(s))作为总体:

>>> n = 4
>>> mask = set(random.sample(range(len(s)), n))
{8, 1, 4, 0}

>>> ''.join('-' if i in mask else c for i, c in enumerate(s))
'--ll-, w-rld!'

答案 3 :(得分:0)

您可以按如下方式使用for循环逐个获取字符串中的每个字母:

ListOjbects

然后创建一个新字符串,其中包含for character in string:' - '或append。{/ p>

答案 4 :(得分:0)

试试这个:

$html=htmlentities($html,ENT_NOQUOTES|ENT_SUBSTITUTE|ENT_DISALLOWED);
$html=str_replace("&lt;","<",$html);
$html=str_replace("&gt;",">",$html);

另一种实现(使用O.O&#39;算法)是这样的:

import random

word = random.choice(wordList)
for i in range(0, len(word), 2):  ## Goes through the numbers between 0 and len(word)-1 with a step of two
    word = word[ : i] + "-" + word[i + 1: ]    ## Str assignment isn't supported so slicing is the best way to do this
相关问题