Python:按特定模式拆分
我有以下几点Python:按特定模式拆分,python,regex,split,Python,Regex,Split,我有以下几点 str = '[5.955894, 45.817792], [10.49238, 45.817792], [10.49238, 47.808381], [5.955894, 47.808381]' 我想拆分它,这样我就有了一个字符串数组,比如 ['[5.955894,45.817792],'[10.49238,45.817792],…] 因此[…]对象是数组的元素。重要的是要包括封闭的[和]。我已经走了这么远: re.split('\D,\s\D', str) 但这给了我: [
str = '[5.955894, 45.817792], [10.49238, 45.817792], [10.49238, 47.808381], [5.955894, 47.808381]'
我想拆分它,这样我就有了一个字符串数组,比如
['[5.955894,45.817792],'[10.49238,45.817792],…]
因此[…]对象是数组的元素。重要的是要包括封闭的[和]。我已经走了这么远:
re.split('\D,\s\D', str)
但这给了我:
['[5.955894, 45.817792', '10.49238, 45.817792', '10.49238, 47.808381', '5.955894, 47.808381]']
不是我想要的 我更喜欢使用
re.findall
并指定我想要的内容,而不是试图描述re.split
>>> s = '[5.955894, 45.817792], [10.49238, 45.817792], [10.49238, 47.808381], [5.955894, 47.808381]'
>>> re.findall(r"\[[^\]]*\]",s)
['[5.955894, 45.817792]', '[10.49238, 45.817792]', '[10.49238, 47.808381]', '[5.955894, 47.808381]']
\[
匹配[[^\]]*
匹配任何内容,但不匹配]\]
匹配]您需要使用带有前瞻性的
re.split
:
不要使用str
作为变量。它是内置的
以下模式:
,[ ]*(?=\[)
将匹配逗号(,)
和一些空格,后跟[
你甚至可以用
look behind
来做这件事。所以,(?这是我写的一个简单的程序,我认为它解决了你的问题,但不是最好的
>>>def split_string(strg, begin = '[', end = ']'):
myList = []
string = ''
for char in strg:
if char == begin:
string = ''
string += char
if char == end:
myList.append(string)
return myList
>>>strg = '[5.955894, 45.817792], [10.49238, 45.817792], [10.49238, 47.808381], [5.955894, 47.808381]'
>>>split_string(strg)
['[5.955894, 45.817792]', '[10.49238, 45.817792]', '[10.49238, 47.808381]', '[5.955894, 47.808381]']
以下是@nhahtdh评论
取决于你的信任问题
In [510]: txt = '[5.955894, 45.817792], [10.49238, 45.817792], [10.49238, 47.808381], [5.955894, 47.808381]'
In [511]: lst = eval ("[%s]" % txt)
In [512]: [str(x) for x in lst]
Out[512]:
['[5.955894, 45.817792]',
'[10.49238, 45.817792]',
'[10.49238, 47.808381]',
'[5.955894, 47.808381]']
eval('['+str+']'))
如果它来自可靠的来源。你最终想要实现什么?我问题中的第二行代码。这就是我想要的。@nhahdh--eval
不会给出OP想要的,但是作为一个补充,有一个ast.literal\u eval
可以做与eval
相同的事情,没有安全隐患。为什么不呢str”(?@mgilson。是的,它们实际上都不是必需的。虽然我确实认为匹配逗号周围的空格是必要的,以防止它出现在输出中——尽管我通常会使用\s*
而不是[]*
--但我想这一切都取决于你想匹配什么。@mgilson..好吧,如果可以有任何其他类型的空格,比如制表符或换行符,而不仅仅是空格,那么就需要\s
了。但这也取决于OP,他想要什么。或者,你可以使用使用非贪婪版本:r“\[.*?\]”
。
In [510]: txt = '[5.955894, 45.817792], [10.49238, 45.817792], [10.49238, 47.808381], [5.955894, 47.808381]'
In [511]: lst = eval ("[%s]" % txt)
In [512]: [str(x) for x in lst]
Out[512]:
['[5.955894, 45.817792]',
'[10.49238, 45.817792]',
'[10.49238, 47.808381]',
'[5.955894, 47.808381]']