2016-02-26 68 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 
相关问题