除了保留的子字符串之外,每个字符都会分裂

时间:2017-03-31 03:38:02

标签: python regex string preserve

给出字符串

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元组可以包含斜杠,反斜杠或任何其他转义字符,因此在上面的正则表达式中替换和转义。

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

EDITED

评论中的细节:

  

并且这两个中的两个字符何时都是唯一的以及它们不是时才有区别?

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

2 个答案:

答案 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))