拆分除保留子字符串之外的每个字符
Spliting on every character except for preserved substring
给定字符串
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
元组可以包含斜杠、反斜杠或任何其他转义字符,因此上述正则表达式中的替换和转义。
有没有更简单的方法实现同字符串替换?
已编辑
来自评论的细节:
And is there a distinction between when both characters in the pair are unique and when they aren't?
不,他们应该以同样的方式对待。
匹配而不是拆分:
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
.
不用正则表达式也可以做到:
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))
给定字符串
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
元组可以包含斜杠、反斜杠或任何其他转义字符,因此上述正则表达式中的替换和转义。
有没有更简单的方法实现同字符串替换?
已编辑
来自评论的细节:
And is there a distinction between when both characters in the pair are unique and when they aren't?
不,他们应该以同样的方式对待。
匹配而不是拆分:
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
.
不用正则表达式也可以做到:
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))