通过多个分隔符和 return 分隔符和分隔字符串分隔字符串
Separate string by multiple separators and return separators and separated strings
我想用分隔符分隔字符串,分隔符由保存在变量 sep_list
中的多个字符组成。
然后我的目标是接收最后一个分隔字符串 s1
和最后一个分隔符 s1
在他的右手边。
sep_list = ['→E', '¬E', '↓I']
string1 = "peter →E tom ¬E luis ↓I ed"
string2 = "sigrid →E jose l. ¬E jose t."
应用于string1
算法应该return字符串s1
:
"↓I, ed"
并应用于 string2
算法应该 return 字符串 s1
:
"¬E, jose t."
用 python 有什么方法可以做到这一点?
假设分隔符可能以任何顺序存在(或根本不存在),您可以这样做:
sep_list = ['→E', '¬E', '↓I']
string1 = "peter →E tom ¬E luis ↓I ed"
string2 = "sigrid →E jose l. ¬E jose t."
def process(s):
indexes = []
for sep in sep_list:
if (index := s.find(sep)) >= 0:
indexes.append((index, sep))
if indexes:
indexes.sort()
t = indexes[-1]
return f"{t[1]},{s[t[0]+len(t[1]):]}"
print(process(string1))
print(process(string2))
输出:
↓I, ed
¬E, jose t.
另一种使用正则表达式的方法:
import re
sep_list = ['→E', '¬E', '↓I']
string1 = "peter →E tom ¬E luis ↓I ed"
string2 = "sigrid →E jose l. ¬E jose t."
def separate_string(data, seps):
pattern = "|".join(re.escape(sep) for sep in seps)
start, end = [m.span() for m in re.finditer(pattern, data)][-1]
return f"{data[start:end]},{data[end:]}"
print(separate_string(string1, sep_list)) # ↓I, ed
print(separate_string(string2, sep_list)) # ¬E, jose t.
- 我们通过用
|
. 分隔每个关键字来创建正则表达式模式
- 对于字符串中的每个匹配项,我们使用
m.span()
来检索匹配项的开始和结束。我们只保留最后一场比赛。
data[start:end]
是分隔符,而 data[end:]
是后面的所有内容。
更新:此解决方案不需要 re 模块!
更新 #2:更短的解决方案。
def run(string):
sep_lst = ['→E', '¬E', '↓I']
tokens = string.split()
result = None
for i,token in enumerate(tokens):
if token in sep_lst:
result = f'{tokens[i]}, {" ".join(tokens[i+1:])}'
return result
print(run("peter →E tom ¬E luis ↓I ed"))
print(run("sigrid →E jose l. ¬E jose t."))
输出:
↓I, ed
¬E, jose t.
我想用分隔符分隔字符串,分隔符由保存在变量 sep_list
中的多个字符组成。
然后我的目标是接收最后一个分隔字符串 s1
和最后一个分隔符 s1
在他的右手边。
sep_list = ['→E', '¬E', '↓I']
string1 = "peter →E tom ¬E luis ↓I ed"
string2 = "sigrid →E jose l. ¬E jose t."
应用于string1
算法应该return字符串s1
:
"↓I, ed"
并应用于 string2
算法应该 return 字符串 s1
:
"¬E, jose t."
用 python 有什么方法可以做到这一点?
假设分隔符可能以任何顺序存在(或根本不存在),您可以这样做:
sep_list = ['→E', '¬E', '↓I']
string1 = "peter →E tom ¬E luis ↓I ed"
string2 = "sigrid →E jose l. ¬E jose t."
def process(s):
indexes = []
for sep in sep_list:
if (index := s.find(sep)) >= 0:
indexes.append((index, sep))
if indexes:
indexes.sort()
t = indexes[-1]
return f"{t[1]},{s[t[0]+len(t[1]):]}"
print(process(string1))
print(process(string2))
输出:
↓I, ed
¬E, jose t.
另一种使用正则表达式的方法:
import re
sep_list = ['→E', '¬E', '↓I']
string1 = "peter →E tom ¬E luis ↓I ed"
string2 = "sigrid →E jose l. ¬E jose t."
def separate_string(data, seps):
pattern = "|".join(re.escape(sep) for sep in seps)
start, end = [m.span() for m in re.finditer(pattern, data)][-1]
return f"{data[start:end]},{data[end:]}"
print(separate_string(string1, sep_list)) # ↓I, ed
print(separate_string(string2, sep_list)) # ¬E, jose t.
- 我们通过用
|
. 分隔每个关键字来创建正则表达式模式
- 对于字符串中的每个匹配项,我们使用
m.span()
来检索匹配项的开始和结束。我们只保留最后一场比赛。 data[start:end]
是分隔符,而data[end:]
是后面的所有内容。
更新:此解决方案不需要 re 模块! 更新 #2:更短的解决方案。
def run(string):
sep_lst = ['→E', '¬E', '↓I']
tokens = string.split()
result = None
for i,token in enumerate(tokens):
if token in sep_lst:
result = f'{tokens[i]}, {" ".join(tokens[i+1:])}'
return result
print(run("peter →E tom ¬E luis ↓I ed"))
print(run("sigrid →E jose l. ¬E jose t."))
输出:
↓I, ed
¬E, jose t.