如何在 Python 中基于多个定界符分割字符串

Dasun Nirmitha 2023年1月30日
  1. 具有两个定界符的 Python 分割字符串
  2. 具有多个定界符的 Python 拆分字符串
如何在 Python 中基于多个定界符分割字符串

Python 字符串 split() 方法允许根据分隔符将字符串轻松拆分为列表。尽管在某些情况下,你可能需要不仅基于一个分隔符值,而且还要基于多个定界符值进行分隔。这篇文章介绍了可以在 Python 中实现的两种便捷方法。

具有两个定界符的 Python 分割字符串

假设以下字符串。

text = "python is, an easy;language; to, learn."

对于我们的示例,我们需要用分号,空格 (; ) 或逗号和空格 (, ) 进行拆分。在这种情况下,不应该考虑出现任何奇数的分号或逗号,即没有尾部空格的 ,;

正则表达式

尽管正则表达式的使用由于字符串解析的昂贵特性而不被推荐使用,但是在这种情况下可以放心使用正则表达式。

使用正则表达式

Python 的内置模块 re 具有一种可用于这种情况的 split() 方法。

让我们使用基本的 a 或 b 正则表达式(a|b)来分隔多个定界符。

import re

text = "python is, an easy;language; to, learn."
print(re.split("; |, ", text))

输出:

['python is', 'an easy;language', 'to', 'learn.']

Wikipedia 页面所述,正则表达式使用 IEEE POSIX 作为其语法的标准。通过引用此标准,我们可以管理几种其他方式来编写符合用例的正则表达式。

无需使用竖线分隔符(|)来定义分隔符,我们可以使用正则表达式中提供的 Range([])语法实现相同的结果。你可以通过在方括号内提供正则表达式可以匹配的字符范围。

因此,当指定正则表达式的模式时,我们可以简单地在方括号内提供分号和逗号,以及一个额外的空格 [[;,]),这将导致正则表达式与具有[分号或逗号]和尾随空格。

import re

text = "python is, an easy;language; to, learn."
print(re.split("[;,] ", text))

创建一个函数

前面提到的正则表达式仅限于硬编码的分隔符集。稍后在进行定界符修改时,这可能会带来麻烦,并且还会限制其在代码其他部分的可重用性。因此,最好使用最佳实践来考虑使代码更加通用和可重用。因此,为了安全起见,让我们将该逻辑编码到 Python 函数中。

import re

text = "python is, an easy;language; to, learn."
separators = "; ", ", "


def custom_split(sepr_list, str_to_split):
    # create regular expression dynamically
    regular_exp = "|".join(map(re.escape, sepr_list))
    return re.split(regular_exp, str_to_split)


print(custom_split(separators, text))

使用字符串函数

如果你想避免使用正则表达式,或者不必为了拆分字符串而在项目中引入新模块,则可以使用 replace()split() 方法出现在字符串模块中本身达到相同的结果。

text = "python is, an easy;language; to, learn."

# transform [semicolon-space] parts of the string into [comma-space]
text_one_delimiter = text.replace("; ", ", ")

print(text_one_delimiter.split(", "))

首先,我们用其他定界符替换逗号中所有出现的分号,后跟空格 (; ),该分隔符是逗号,后跟空格 (, )。这样,我们可以将字符串拆分限制为一个定界符,在这种情况下,它是一个逗号,后跟一个空格 (, )

现在,我们可以使用 Python 字符串模块内置的简单 split() 函数安全地拆分修改后的字符串,以得到相同的结果。

请注意,这次我们尚未将任何新模块导入代码中以实现结果。

具有多个定界符的 Python 拆分字符串

参考下面提到的文本。

text = "python is# an% easy;language- to, learn."

对于此示例,我们需要在所有实例上将其分割为文本具有任何字符 # % ; - ,,后跟一个空格。

正则表达式

在这种情况下,我们可以在定义正则表达式时轻松添加其他分隔符。

import re

text = "python is# an% easy;language- to, learn."
print(re.split("; |, |# |% |- ", text))

输出:

['python is', 'an', 'easy;language', 'to', 'learn.']

作为一个函数

同样在这种情况下,我们可以简单地使用我们之前使用的带有两个定界符的代码,只需将所有其他分隔符添加到 separators 变量中即可。

import re

text = "python is# an% easy;language- to, learn."
separators = "; ", ", ", "# ", "% ", "- "


def custom_split(sepr_list, str_to_split):
    # create regular expression dynamically
    regular_exp = "|".join(map(re.escape, sepr_list))
    return re.split(regular_exp, str_to_split)


print(custom_split(separators, text))

使用字符串函数

与我们之前使用两个定界符处理它的方式类似,我们可以使用 replace()split() 函数也可以解决此问题。

text = "python is, an easy;language; to, learn."

# transform [semicolon-space] parts of the string into [comma-space]
text_one_delimiter = (
    text.replace("# ", ", ").replace("% ", ", ").replace("; ", ", ").replace("- ", ", ")
)

print(text_one_delimiter.split(", "))

输出:

['python is', 'an easy;language', 'to', 'learn.']

应该注意的是,在这种情况下,当用于更高的定界符计数时,不建议使用此方法。由于在这种情况下,必须多次使用字符串 replace() 方法才能对字符串进行多次遍历,因此最终将导致不希望的性能峰值,使用正则表达式可以轻松避免。

相关文章 - Python String