给出字符串
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
元组可以包含斜杠,反斜杠或任何其他转义字符,因此在上面的正则表达式中替换和转义。
是否有更简单的方法来实现相同的字符串替换?
评论中的细节:
并且这两个中的两个字符何时都是唯一的以及它们不是时才有区别?
不,他们应该以同样的方式对待。
答案 0 :(得分: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
。
答案 1 :(得分: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))