如何在 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()
方法才能对字符串进行多次遍历,因此最终将导致不希望的性能峰值,使用正则表达式可以轻松避免。