如何有条件地将字符插入字符串?

时间:2019-06-01 06:13:25

标签: python string

编程的新手,到目前为止,我已经从网上的类似示例中学到了东西。

这是用于外语的随机句子生成器。但是,如果它们恰好相邻出现,我想在字符串的两个特定字符之间插入一个字符。在这种情况下,我希望evowel和avowel变量中的字符用'y'分隔。

我以为我可以尝试有条件的拆分+重新加入,但是我不确定如何搜索(在这种情况下)evowel_avowel,在该边界处拆分,插入y,然后重新加入。因此,随机生成的字符串“ eametetuk”将变为“ eyametetuk”,“ eseapah”>“ eseyapah”等。

编辑:我需要能够处理元音中的任何内容。为了简单起见,我只包含两个变体,但是该语言具有更多的元音和更多的变体(大约60个变体需要发生这种变化)。

我需要为此创建自己的函数吗?我猜我在某处需要正则表达式。

import random

c1 = ("e","é")
c2 = ("a","se")
root = ("apa","mete")
tense = ("h","tuk")

avowel = ("a","á")
evowel = ("e","é")

#syntax
x = [c1,c2,root,tense]

#randomly selects morphemes
s = "".join([random.choice(i) for i in x])

print(s)

3 个答案:

答案 0 :(得分:0)

您可以像下面这样进行替换。

import random

c1 = ("e","é")
c2 = ("a","se")
root = ("apa","mete")
tense = ("h","tuk")

avowel = "éá"
avowelr= "éyá"
evowel = "ea"
evowelr = "eya"

#syntax
x = [c1,c2,root,tense]

#randomly selects morphemes
s = "".join([random.choice(i) for i in x])
s = s.replace(avowel, avowelr)
s = s.replace(evowel, evowelr)
print(s)

答案 1 :(得分:0)

使用正则表达式(re模块):

import re
txt1 = "eametetuk"
txt2 = "eseapah"
evowel = ("e","é")
avowel = ("a","á")
evowels = "|".join(evowel)
avowels = "|".join(avowel)
out1 = re.sub(r'('+evowels+')('+avowels+')',r'\1y\2',txt1)
out2 = re.sub(r'('+evowels+')('+avowels+')',r'\1y\2',txt2)
print(out1) # eyametetuk
print(out2) # eseyapah

该方法适用于任何元音-元音组合,例如:

txt3 = "xéay"
out3 = re.sub(r'('+evowels+')('+avowels+')',r'\1y\2',txt3)
print(out3) # xéyay

以此类推。

说明:我使用的|在正则表达式模式内表示LOGICAL OR。然后,我创建了具有两组的模式-用括号表示,然后在re.sub的第二个参数中写道,我想要第一个组,然后是字母y,然后是第二个组。

请注意,re.sub的组索引从1而不是0开始,还请注意,我使用了原始字符串,这意味着我不必转义\即可指向第一组和第二组

答案 2 :(得分:0)

您可以通过遍历字符串中的所有成对字符,检查第一个是否在evowels中,第二个在元音中,如果是,则返回第一个,并返回y,否则返回第一个。 br /> 如果这是通过列表理解完成的,则可以将其直接连接到结果字符串:

txt1 = "eametetuk"
txt2 = "eseapah"
evowel = 'eé' #("e","é")    you're free to put all vowels in one string, too'
avowel = 'aá' #("a","á")    because strings are also iterables

def vowel_pair_sep(txt, sep='y', ev='eé', av='aá'):
    return (''.join(
    e + sep
    if (e in ev) and (a in av)
    else e
    for e, a in zip(txt[:-1], txt[1:]))
    + txt[-1])

vowel_pair_sep(txt1)
# eyametetuk
vowel_pair_sep(txt2)
# eseyapah              

由于分隔符和元音是该函数的参数,因此可以轻松地适应不同的需求:

vowel_pair_sep('tkdgtkdg', '_', 'dt', 'gk')
# t_kd_gt_kd_g