给定一个Python字符串,我希望在给定范围的字符串sentence
内宽间隔出现给定的word
子字符串。我找不到一个高效而简洁的方法来执行这个算法。在
我只想让索引在sentence
字符串的给定范围内的单词加宽空格,并且单词必须是精确的(不能被字母和数字等其他单词字符包围)。标点符号和其他符号在计算单词准确度时被忽略。在
到目前为止,我的函数widespace(sentence, word, start = None, end = None):
应该在从start
到end
的给定范围内为给定的word
增加空间,但目前它看起来相当低效和冗长。它也不能检测精确的单词匹配和忽略标点符号。在
预期结果
range(start, end)
内,则它的所有出现都将受到影响,也就是说,索引大于或等于start
,严格地小于end
。在"omg"
,它接受"omg!"
和{"omg"
,例如"zomg"
或{widespace("Foo, Bar, Baz!", "Baz")
变成{widespace("Foo, Foo, Foo!", "Foo")
变成{widespace("Foo, Foo, Foo!", "Foo", start = 0, end = 2)
变成F o o, Foo, Foo!
widespace("Foo, Foo, Foo!", "Foo", start = 0, end = 5)
变为F o o, Foo, Foo!
,就像前面的例子一样
widespace("Foo, Foo, Foo!", "Foo", start = 0, end = 6)
变成F o o, F o o, Foo!
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中,如何将给定单词(完全匹配,忽略标点符号)加宽到一定范围?一个能满足所有期望的有效解决方案是首选,尽管我对结果非常灵活。在
首先,将整个字符串“加宽”的最简单、可能也是最有效的方法是:
这是因为字符串是迭代每个单独字符的iterable,所以如果您将一个传递给
join
,它将所有字符与每对字符之间的独立in连接起来。在那么,你怎么把绳子的最宽部分呢?简单:将其切片,
^{pr2}$join
只需将其放宽,然后将其合并在一起:这与您要求的接口不太一样,但我不确定
word
在您的问题中应该做什么,所以我只写了一个最简单的东西,即widespaces所有的东西,希望您能找出如何将其映射到您想要的:请注意,这也允许您使用
start=None, end=None
默认值,它们将自动使用与切片中相同的含义,range
等。None
表示从开始处开始或在结尾处结束。在这将是非常有效的,但可能不如创建一个在开始时为
len(s) + end - start
预留空间的自定义C扩展,然后在C中的字符上循环相关问题 更多 >
编程相关推荐