Python re.compile,将字符串拆分为两个,同时保留分隔符

时间:2016-02-26 17:54:25

标签: python regex python-2.7

我想将带有公共分隔符的字符串拆分为两个单独的字符串。我不确定正则表达式是否是正确的选择,但.split, sep似乎是针对单词,而我的总是会有所不同,如下所示。

我目前的做法的主要问题是我无法解释何时在( )之间分配名称。在没有(Name)描述符的情况下,我仍然需要foo / foo [1]字符串。

我目前还没有在我要保留的字符串中返回)分隔符。我应该创建两个re.group然后拆分还是有更简单的方法来解决这个问题?

示例字符串

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

3 个答案:

答案 0 :(得分:1)

我能想到的最简单的方法是使用str.split进行最大拆分,然后将')'添加回第一个字符串。

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

答案 1 :(得分:1)

你可以这样做

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

不幸的是,Name中的(...)你需要手动编写它们,因为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(),则会更加简单。

e.g。

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

答案 2 :(得分:1)

我的建议是:

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

foo = get_foo(s1)
# And so on