在Python中如何在给定范围内扩展单词?

2024-10-03 09:12:50 发布

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

给定一个Python字符串,我希望在给定范围的字符串sentence内宽间隔出现给定的word子字符串。我找不到一个高效而简洁的方法来执行这个算法。在

我只想让索引在sentence字符串的给定范围内的单词加宽空格,并且单词必须是精确的(不能被字母和数字等其他单词字符包围)。标点符号和其他符号在计算单词准确度时被忽略。在

到目前为止,我的函数widespace(sentence, word, start = None, end = None):应该在从startend的给定范围内为给定的word增加空间,但目前它看起来相当低效和冗长。它也不能检测精确的单词匹配和忽略标点符号。在

预期结果

  1. 如果该词在range(start, end)内,则它的所有出现都将受到影响,也就是说,索引大于或等于start严格地小于end。在
  2. 精确匹配忽略标点符号,但区分大小写。例如,如果要匹配"omg",它接受"omg!"和{},但不接受由其他单词字符包围的"omg",例如"zomg"或{}
    • 单词字符可以包括数字、字母、连字符,这是您的首选。在
  3. widespace("Foo, Bar, Baz!", "Baz")变成{}
    • 指数是10。在
  4. widespace("Foo, Foo, Foo!", "Foo")变成{}
    • 指数为0、5、10。在
  5. widespace("Foo, Foo, Foo!", "Foo", start = 0, end = 2)变成
    F o o, Foo, Foo!
    • 指数为0、5、10。只有第一个(索引0)受到影响。在
  6. widespace("Foo, Foo, Foo!", "Foo", start = 0, end = 5)变为
    F o o, Foo, Foo!,就像前面的例子一样
    • 指数为0、5、10。只有第一个(索引0)受到影响,因为第二个与5完全匹配,这超出了范围。在
  7. widespace("Foo, Foo, Foo!", "Foo", start = 0, end = 6)变成
    F o o, F o o, Foo!
    • 指数为0、5、10。只有前两个匹配。在
  8. widespace("Mulliganaceous Mulligan, OMG", "Mulligan")应该变成
    Mulliganaceous M u l l i g a n, OMG"
    • "Mulliganaceous"不是完全匹配的。但是"Mulligan,"被视为一,因为它没有被其他单词字符包围。在
    • 我现在有M u l l i g a naceous M u l l i g a n

当前代码

到目前为止,我已经开始工作了,但是代码相当长,可能效率低下,无法处理精确的匹配和标点符号。在

def widespace(sentence: str, word: str, start: int = None, end: int = None):
    if not start:
        start = 0
    if not end:
        end = len(sentence)

    spacedword = " ".join(word)
    indices = []
    cur = sentence.find(word, start)

    # Find all occurrences of the word
    while cur >= 0 and cur < end + len(word) - 1:
        # Add to list
        indices.append(cur) 

        # Next occurrence
        cur = cur + len(word)
        cur = sentence.find(word, cur, end + len(word) - 1)
    print("\t" + str(indices)) # To check indices

    # Replace word with spaced-out word
    while len(indices) > 0:
        index = indices.pop()
        sa = sentence[:index]
        sb = sentence[index:index + len(word)]
        sc = sentence[index + len(word):]
        sb = sb.replace(word, spacedword)
        sentence = sa + sb + sc

    return sentence

在Python中,如何将给定单词(完全匹配,忽略标点符号)加宽到一定范围?一个能满足所有期望的有效解决方案是首选,尽管我对结果非常灵活。在


Tags: 字符串indexlenfoo指数字符单词start
1条回答
网友
1楼 · 发布于 2024-10-03 09:12:50

首先,将整个字符串“加宽”的最简单、可能也是最有效的方法是:

' '.join(s)

这是因为字符串是迭代每个单独字符的iterable,所以如果您将一个传递给join,它将所有字符与每对字符之间的独立in连接起来。在

那么,你怎么把绳子的最宽部分呢?简单:将其切片,join只需将其放宽,然后将其合并在一起:

^{pr2}$

这与您要求的接口不太一样,但我不确定word在您的问题中应该做什么,所以我只写了一个最简单的东西,即widespaces所有的东西,希望您能找出如何将其映射到您想要的:

>>> s = 'foo foo foo foo foo foo foo'
>>> s[:8] + ' '.join(s[8:15]) + s[15:]
'foo foo f o o   f o o foo foo foo'

请注意,这也允许您使用start=None, end=None默认值,它们将自动使用与切片中相同的含义,range等。None表示从开始处开始或在结尾处结束。在

这将是非常有效的,但可能不如创建一个在开始时为len(s) + end - start预留空间的自定义C扩展,然后在C中的字符上循环

相关问题 更多 >