2016-02-26 67 views
0

我想將具有共同分隔符的字符串拆分爲兩個單獨的字符串。我不確定是否正則表達式是正確的選擇,但.split, sep似乎是針對單詞,我的將永遠是不同的,如下所示。Python re.compile,將字符串拆分爲兩個,同時保留分隔符

我目前的做法的主要問題是,我不能說明名稱未在()之間分配的時間。在沒有(Name)描述符的情況下,我仍然需要一個foo/foo [1]字符串。

我現在還沒有返回我想保留的字符串中的)分隔符。我應該創建兩個re.groups然後分裂嗎?還是有更簡單的方法來解決這個問題?

樣品字符串

s1 = '(NTUSER.DAT) Checks for IOCs for Clampi (per Trend Micro)' 
s2 = '(NTUSER.DAT) Autostart - get Command Processor\AutoRun value from NTUSER.DAT hive' 
s3 = '(All) Parse hive, print deleted keys/values' 
s4 = '(NTUSER.DAT;Software) Get IE Zone settings' 
s5 = 'Gets users Startup Folder location' 

所需的輸出

'Name', 'Text' #E.g. (NTUSER.DAT), Checks for IOCs for Clampi (per Trend Micro) 

我已經試過

foo = re.compile("[)]").split(string) #this doesn't preserve the ")" on output 
+2

我想你想'match',不'split' –

回答

1

您可以用這種方式

>>> foo = re.compile(r'(?<=^\(NTUSER\.DAT\)) |(?<=^\(All\)) |(?<=^\(NTUSER\.DAT;Software\)) |(?<=^\(\)) ') 

不幸的是,Name S IN (...)是你必須將它們全部手工編寫,因爲lookbehind不允許使用量詞做。

>>> foo.split(s1) 
['(NTUSER.DAT)', 'Checks for IOCs for Clampi (per Trend Micro)'] 
>>> foo.split(s2) 
['(NTUSER.DAT)', 'Autostart - get Command Processor\\AutoRun value from NTUSER.DAT hive'] 
>>> foo.split(s3) 
['(All)', 'Parse hive, print deleted keys/values'] 
>>> foo.split(s4) 
['(NTUSER.DAT;Software)', 'Get IE Zone settings'] 
>>> foo.split('() abcde')               
['()', 'abcde'] 

無論如何,@Andrea Corbellini已經提到過。如果您使用match()而不是split(),則更爲簡單。

例如

>>> foo = re.compile(r'^(\(.*?\)) (.*)$') 
>>> result = foo.match(s1) 
>>> result.group(1) + ', ' + result.group(2) 
'(NTUSER.DAT), Checks for IOCs for Clampi (per Trend Micro)' 
1

最簡單的我能想到的方法是使用str.split並將其分割爲最大值,然後將')'添加到第一個字符串中。

res = s1.split(')', 1) 
res[0] += ')' 
+0

不,它只是不會分割字符串,你會得到一個列表一個元素。 –

1

我的建議是:

get_foo = re.compile(r'([^\)]*\)?)').findall 

foo = get_foo(s1) 
# And so on 
相關問題