我知道這個問題過去已經得到了回答。但是我仍然遇到困難,盡管我已經嘗試應用我在網上找到的多個建議。所以,我想要的很容易。拆分此字串
"__label__2:somedata"
或者
"__label__43:somedata"
并得到
['__label__2:', 'somedata']
或者
['__label__43:', 'somedata'].
這是我的代碼:
import re
line = "__label__2:somedata"
p = re.split("(__label__{1,2}:)", line)
print (p)
但這不幸列印
['__label__2:somedata']
我在這里做錯了什么?
uj5u.com熱心網友回復:
您需要在正則運算式中添加 \d ,如下所示:
(__label__\d :)
這也允許您捕獲所有數字,而不必列出所有可能的值......
uj5u.com熱心網友回復:
"(__label__{1,2}:)"不是按照你的想法去做。{1,2}要求重復 1 或 2 次__label__字串,而不是字符1或2。
正確的語法是使用[12]:
import re
re.split('(__label__[12]:)', "__label__2:somedata")
輸出: ['', '__label__2:', 'somedata']
如果您想在任何__label__ digit :使用后拆分\d ,也可以切片以洗掉第一個空字串:
>>> re.split('(__label__\d :)', "__label__789:somedata")[1:]
['__label__789:', 'somedata']
uj5u.com熱心網友回復:
您似乎在拆分字串和匹配其中的一部分之間猶豫不決。兩者都是可能的,但它們是不同的,并且具有不同的用例。
分裂:
您只需拆分
:并將分隔符添加到除最后一部分之外的所有部分:lst = line.split(':') mx = len(lst) - 1 result = [ s if i == mx else s ':' for i, s in enumerate(lst)]比賽:
您必須匹配第一部分,并分別匹配該行的其余部分:
m = re.match('(__label__\\d{1,2}:)(.*)', line) resul = m.groups()
如果您可以期望有 2 個以上的欄位,您將拆分,如果您想控制第一個的模式,您將進行匹配。
uj5u.com熱心網友回復:
您可以使用.partition:
>>> s="__label__2:somedata"
>>> t=s.partition(':')
>>> [t[0] t[1], t[2]]
['__label__2:', 'somedata']
如果你有一堆,你可以使用一個理解:
cases=("__label__2:somedata", "__label__43:somedata" )
>>> [[t[0] t[1], t[2]] for t in map(lambda s: s.partition(':'), cases)]
[['__label__2:', 'somedata'], ['__label__43:', 'somedata']]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/341560.html
