【问题标题】:Python re.compile, split string into two while preserving delimiterPython re.compile,将字符串分成两部分,同时保留分隔符
【发布时间】:2016-06-10 01:41:46
【问题描述】:

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

我当前方法的主要问题是我无法解释何时未在( ) 之间分配名称。在没有 (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

【问题讨论】:

  • 我想你想match,而不是split

标签: python regex python-2.7


【解决方案1】:

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

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

【讨论】:

  • 不,它只是不会拆分字符串,您会得到一个包含一个元素的列表。
【解决方案2】:

你可以这样做

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

不幸的是,(...)s 中的Names 你必须手动编写它们,因为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)'

【讨论】:

    【解决方案3】:

    我的建议是:

    get_foo = re.compile(r'([^\)]*\)?)').findall
    
    foo = get_foo(s1)
    # And so on
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多