如何在 Python 中基于多个定界符分割字符串
Python 字符串 split()
方法允许根据分隔符将字符串轻松拆分为列表。尽管在某些情况下,你可能需要不仅基于一个分隔符值,而且还要基于多个定界符值进行分隔。这篇文章介绍了可以在 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()
函数安全地拆分修改后的字符串,以得到相同的结果。
请注意,这次我们尚未将任何新模块导入代码中以实现结果。
参考下面提到的文本。
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()
方法才能对字符串进行多次遍历,因此最终将导致不希望的性能峰值,使用正则表达式可以轻松避免。
相关文章
Django 中的 Slug
发布时间:2023/05/04 浏览次数:173 分类:Python
-
本篇文章旨在定义一个 slug 以及我们如何使用 slug 字段在 Python 中使用 Django 获得独特的帖子。
在 Django 中按降序过滤查询集中的项目
发布时间:2023/05/04 浏览次数:157 分类:Python
-
在这个讲解中,学习如何借助 Django 中的 order_by() 方法按降序过滤出查询集中的项目。
Django ALLOWED_HOSTS 介绍
发布时间:2023/05/04 浏览次数:181 分类:Python
-
本文展示了如何创建您的 Django 网站,为公开发布做好准备,如何设置 ALLOWED_HOSTS 以及如何在使用 Django 进行 Web 部署期间修复预期的主要问题。
Django 中的 Select_related 方法
发布时间:2023/05/04 浏览次数:129 分类:Python
-
本文介绍了什么是查询集,如何处理这些查询以及我们如何利用 select_related() 方法来过滤 Django 中相关模型的查询。
使用 Post 请求将数据发送到 Django 服务器
发布时间:2023/05/04 浏览次数:159 分类:Python
-
在这篇关于Django的讲解中,我们简要介绍了post和get请求以及如何在Django中用post实现CSRF token。
Django 返回 JSON
发布时间:2023/05/04 浏览次数:106 分类:Python
-
在与我们的讨论中,我们简要介绍了 JSON 格式,并讨论了如何借助 Django 中的 JsonResponse 类将数据返回为 JSON 格式。
在 Django 中创建对象
发布时间:2023/05/04 浏览次数:59 分类:Python
-
本文的目的是解释什么是模型以及如何使用 create() 方法创建对象,并了解如何在 Django 中使用 save() 方法。
在 Django 中为多项选择创建字段
发布时间:2023/05/04 浏览次数:75 分类:Python
-
在本文中,我们将着眼于为多项选择创建一个字段,并向您展示如何允许用户在 Django 中进行多项选择。