通过多个分隔符和 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.