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

2024-09-26 22:55:29 发布

您现在位置:Python中文网/ 问答频道 /正文

对编程来说是全新的,到目前为止我所学到的只是从网上类似的例子中复制过来的。你知道吗

这是一个随机的外语句子生成器。但是,如果字符串中的两个特定字符碰巧相邻出现,我想在它们之间插入一个字符。在本例中,我希望evowel和avowel变量中的字符用“y”分隔。你知道吗

我想我可以尝试一个有条件的split+rejoin,但我不知道如何搜索(在本例中)evowel\u avowel,在该边界处拆分它,插入y,然后将其连接回来。因此,随机生成的字符串“eametetuk”将更改为“eyametetuk”、“eseapah”>;“eseyapah”等

编辑:我需要能够处理任何在evowel与avowel的任何东西。为了简单起见,我只列出了每种语言的两个变体,但是这种语言有更多的元音和更多的变体(因此大约有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)

Tags: 字符串语言编程randomroot变体字符例子
3条回答

你可以做如下的替换。你知道吗

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)

通过遍历字符串中的所有字符对,检查第一个字符是否在evowels中,第二个字符是否在avowels中,如果是,则返回第一个字符,后面跟着y,否则只返回第一个。
如果在列表中执行此操作,则可以将其直接连接到生成的字符串:

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                                                

使用正则表达式(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

该方法适用于任何evowel-avowel组合,例如:

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

等等。你知道吗

说明:我使用了|,它在正则表达式模式中表示逻辑或。然后我创建了两个组的模式-用括号表示,然后在re.sub的第二个参数中,我写下我想要1stgroup,然后是字母y,然后是第二个group。你知道吗

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

相关问题 更多 >

    热门问题