2

给定字符串

word = "These"

包含元组

pair = ("h", "e")

目的是替换word除元组以外的所有字符pair,即输出:

('T', 'he', 's', 'e')

我试过了:

word = 'These'
pair = ('h', 'e')
first, second = pair
pair_str = ''.join(pair)
pair_str = pair_str.replace('\\','\\\\')
pattern = re.compile(r'(?<!\S)' + re.escape(first + ' ' + second) + r'(?!\S)')
new_word = ' '.join(word)
new_word = pattern.sub(pair_str, new_word)
result = tuple(new_word.split())

请注意,有时pair元组可以包含斜杠、反斜杠或任何其他转义字符,因此上述正则表达式中的替换和转义。

有没有更简单的方法来实现相同的字符串替换?


已编辑

评论中的细节:

当这对中的两个角色都是唯一的和不是时有区别吗?

不,他们应该以同样的方式对待。

4

2 回答 2

3

匹配而不是拆分:

pattern = re.escape(''.join(pair)) + '|.'
result = tuple(re.findall(pattern, word))

模式是<pair>|.,如果可能,匹配该对,否则匹配单个字符*。

您也可以在没有正则表达式的情况下执行此操作:

import itertools

non_pairs = word.split(''.join(pair))
result = [(''.join(pair),)] * (2 * len(non_pairs) - 1)
result[::2] = non_pairs
result = tuple(itertools.chain(*result))

* 但是,它不匹配换行符;如果你有这些,re.DOTALL作为第三个参数传递给re.findall.

于 2017-03-31T03:53:05.810 回答
1

您可以在不使用正则表达式的情况下做到这一点:

import functools

word = 'These here when she'
pair = ('h', 'e')
digram = ''.join(pair)
parts = map(list, word.split(digram))
lex = lambda pre,post: post if pre is None else pre+[digram]+post

print(functools.reduce(lex, parts, None))
于 2017-03-31T04:14:31.970 回答