Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python在某个字符之前拆分_Python_String_Split - Fatal编程技术网

Python在某个字符之前拆分

Python在某个字符之前拆分,python,string,split,Python,String,Split,我有以下字符串: BUCKET1:/dir1/dir2/BUCKET1:/dir3/dir4/BUCKET2:/dir5/dir6 我正在尝试以一种方式将其拆分,我将返回以下dict/其他数据结构: BUCKET1 -> /dir1/dir2/, BUCKET1 -> /dir3/dir4/, BUCKET2 -> /dir5/dir6/ 如果我只有一个桶,而不是多个桶,我可以以某种方式将其拆分,如下所示: res.split(res.split(':', 1)[0].re

我有以下字符串:

BUCKET1:/dir1/dir2/BUCKET1:/dir3/dir4/BUCKET2:/dir5/dir6
我正在尝试以一种方式将其拆分,我将返回以下dict/其他数据结构:

BUCKET1 -> /dir1/dir2/, BUCKET1 -> /dir3/dir4/, BUCKET2 -> /dir5/dir6/
如果我只有一个桶,而不是多个桶,我可以以某种方式将其拆分,如下所示:

res.split(res.split(':', 1)[0].replace('.', '').upper()) -> it's not perfect 

输入:ADRIAN:/dir1/dir11/DANIEL:/dir2/ADI_BUCKET:/dir3/CULEA:/dir4/ADRIAN:/dir5/ADRIAN:/dir6/

输出:[(ADRIAN,/dir1/dir11),(DANIEL,/dir2/),(CULEA,/dir3/),(ADRIAN,/dir5/),(ADRIAN,/dir6/)


根据Wiktor Stribiżew的评论,以下正则表达式完成了这项工作:

 r"(BUCKET1|BUCKET2):(.*?)(?=(?:BUCKET1|BUCKET2)|$)"
改用正则表达式

impore re
test = 'BUCKET1:/dir1/dir2/BUCKET1:/dir3/dir4/BUCKET2:/dir5/dir6'

output = re.findall(r'(?P<bucket>[A-Z0-9]+):(?P<path>[/a-z0-9]+)', test)
print(output)
使用功能:

s = "ADRIAN:/dir1/dir11/DANIEL:/dir2/ADI_BUCKET:/dir3/CULEA:/dir4/ADRIAN:/dir5/ADRIAN:/dir6/"
result = re.findall(r'(\w+):([^:]+\/)', s)

print(result)
输出:

[('ADRIAN', '/dir1/dir11/'), ('DANIEL', '/dir2/'), ('ADI_BUCKET', '/dir3/'), ('CULEA', '/dir4/'), ('ADRIAN', '/dir5/'), ('ADRIAN', '/dir6/')]

如果你有经验,我建议你像其他人建议的那样学习正则表达式。但是,如果你正在寻找替代方法,这里有一种不用正则表达式的方法。它也会产生你想要的输出

string = input("Enter:") #Put your own input here.

tempList = string.replace("BUCKET",':').split(":")
outputList = []
for i in range(1,len(tempList)-1,2):
    someTuple = ("BUCKET"+tempList[i],tempList[i+1])
    outputList.append(someTuple)

print(outputList) #Put your own output here.
这将产生:

[('BUCKET1', '/dir1/dir2/'), ('BUCKET1', '/dir3/dir4/'), ('BUCKET2', '/dir5/dir6')]

如果您不熟悉正则表达式,则希望此代码更易于理解和操作,但如果您熟悉如何使用它,我个人仍然建议您使用正则表达式来解决此问题。

似乎您有一个预定义的“bucket”列表,您希望将其用作字符串内记录的边界

这意味着,匹配这些键值对的最简单的方法是匹配其中一个bucket,然后是冒号,然后是任何字符,而不是开始一个与这些bucket名称相等的字符序列

你可以用

r"(BUCKET1|BUCKET2):(.*?)(?=(?:BUCKET1|BUCKET2)|$)"
如果您的值跨越多行,请使用
re.S
/
re.DOTALL
进行编译。请参阅

详细信息

  • (BUCKET1 | BUCKET2)
    -捕获匹配并存储在
    中的组1。组(1)
    任何存储桶名称
  • -冒号
  • (.*)
    -任何0+字符,尽可能少(因为
    *?
    是惰性量词),直到第一次出现(但不包括)
  • (?=(?:BUCKET1 | BUCKET2)|$)
    -任何存储桶名称或字符串结尾
在转义bucket名称时动态构建它(只是为了在这些名称包含
*
+
或其他特殊字符时安全起见):


请参阅。

您不能使用两个相同键(BUCKET1)的dict你应该发布实际需求,在问题中添加关于bucket名称的详细信息。如果你有一个列表,请在问题中提供列表。你似乎需要一个类似regex的。如果我没有BUCKET1、BUCKET2等,而是有不同的名称,例如:Adrian、Roman等,会怎么样?我怎样才能这样分割它?@adriandielculea,你呢应该为键和值指定确切的规则。例如:键应该以大写字母开头或只包含大写字母,值应该由小写字母或其他字符组成。定义一些规则不要忘记
import re
!我无法控制这一点。我只知道所有的bucket(无论它们有什么名称)是在“:”之前,就是这样。我希望能够按之前的内容进行拆分“@FelixBuechner,我永远不会忘记导入它。这意味着如果不是BUCKET1、BUCKET2等,而是这些桶的不同名称,例如Adrian、Ashish等。我如何能够以这种方式拆分它?您必须修改
[A-Z0-9]+
part以正确捕获存储桶名称。您可以使用它检查正则表达式。
r"(BUCKET1|BUCKET2):(.*?)(?=(?:BUCKET1|BUCKET2)|$)"
import re
buckets = ['BUCKET1','BUCKET2']
rx = r"({0}):(.*?)(?=(?:{0})|$)".format("|".join([re.escape(bucket) for bucket in buckets]))
print(rx)
s = "BUCKET1:/dir1/dir2/BUCKET1:/dir3/dir4/BUCKET2:/dir5/dir6"
print(re.findall(rx, s))
# => (BUCKET1|BUCKET2):(.*?)(?=(?:BUCKET1|BUCKET2)|$)
     [('BUCKET1', '/dir1/dir2/'), ('BUCKET1', '/dir3/dir4/'), ('BUCKET2', '/dir5/dir6')]