在 Python 中用分隔符拆分字符串
- 2024-12-02 08:41:00
- admin 原创
- 165
问题描述:
考虑以下输入字符串:
'MATCHES__STRING'
我想在__
出现“分隔符”的地方拆分该字符串。这应该输出一个字符串列表:
['MATCHES', 'STRING']
要按空格进行拆分,请参阅如何将字符串拆分为单词列表?。
要提取第一个分隔符之前的所有内容,请参阅第一次出现时拆分。
要提取最后一个分隔符之前的所有内容,请参阅在 Python 中分割字符串并获取冒号后最后一个段的值。
解决方案 1:
使用str.split
方法:
>>> "MATCHES__STRING".split("__")
['MATCHES', 'STRING']
解决方案 2:
除了split
and之外rsplit
,还有partition
/ rpartition
。它将字符串分隔一次,但根据问题的提问方式,它也可能适用。
例子:
>>> "MATCHES__STRING".partition("__")
('MATCHES', '__', 'STRING')
>>> "MATCHES__STRING".partition("__")[::2]
('MATCHES', 'STRING')
然后速度再快一点split("_",1)
:
$ python -m timeit "'validate_field_name'.split('_', 1)[-1]"
2000000 loops, best of 5: 136 nsec per loop
$ python -m timeit "'validate_field_name'.partition('_')[-1]"
2000000 loops, best of 5: 108 nsec per loop
时间表基于此答案
解决方案 3:
您可能对该模块感兴趣csv
,它是为逗号分隔的文件设计的,但可以轻松修改为使用自定义分隔符。
import csv
csv.register_dialect( "myDialect", delimiter = "__", <other-options> )
lines = [ "MATCHES__STRING", "MATCHES __ STRING" ]
for row in csv.reader( lines ):
...
解决方案 4:
当字符串中有两个或更多元素时(在下面的示例中有三个),可以使用逗号分隔这些项目:
date, time, event_name = ev.get_text(separator='@').split("@")
这行代码之后,三个变量将具有来自变量的三个部分的值ev
。
因此,如果变量ev
包含此字符串并且我们应用分隔符@
:
Sa., 23. März@19:00@Klavier + Orchester: SPEZIAL
然后,split
操作后变量
date
将具有价值Sa., 23. März
time
将具有价值19:00
event_name
将具有价值Klavier + Orchester: SPEZIAL
解决方案 5:
对于 Python 3.8,您实际上不需要该get_text
方法,您可以直接使用ev.split("@")
,事实上该get_text
方法会引发 AttributeError。因此,如果您有一个字符串变量,例如:
filename = 'file/foo/bar/fox'
您可以按照上面的评论中的建议,用逗号将其拆分为不同的变量,但需要进行更正:
W, X, Y, Z = filename.split('_')
W = 'file'
X = 'foo'
Y = 'bar'
Z = 'fox'
解决方案 6:
当您想用特定分隔符(例如:__
或|
或,
等)拆分字符串时,使用方法(如顶部答案中所示)拆分会更容易、更快捷,.split()
因为 Python 字符串方法直观且经过优化。但是,如果您需要使用模式(例如" __ "
和"__"
)拆分字符串,那么使用内置re
模块可能会很有用。
对于OP中的例子:
import re
s1 = "MATCHES__STRING"
s2 = "MATCHES __ STRING"
re.split(r"s*__s*", s1) # ['MATCHES', 'STRING']
re.split(r"s*__s*", s2) # ['MATCHES', 'STRING']
s*
匹配 0 个或更多空格字符,即,如果有空格,它将匹配任何空格,因此上述模式匹配__
和__
。
如果需要拆分字符串列表,那么首先编译模式会更有效。
texts = ["a __ b", "c__d__e", "f __ g"]
pattern = re.compile(r"s*__s*")
[pattern.split(s) for s in texts]
# [['a', 'b'], ['c', 'd', 'e'], ['f', 'g']]