我想将带有公共分隔符的字符串拆分为两个单独的字符串。我不确定正则表达式是否是正确的选择,但.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
答案 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