Python/Regex:如果一行确实包含某个特殊字符,则拆分字符串

Python/Regex:如果一行确实包含某个特殊字符,则拆分字符串,python,regex,regex-negation,regex-lookarounds,Python,Regex,Regex Negation,Regex Lookarounds,我试图拆分字符上的多行字符串,但仅当该行不包含:时。不幸的是,我找不到一种简单的方法来使用re.split()对字符:进行负回溯,因为:可能发生在字符串前面的另一行中 例如,我想在)上拆分下面的字符串 字符串: Hello1 ( First : (), Second ) Hello2 ( First ) ['Hello1 (\nFirst : (),\nSecond', 'Hello2 (\nFirst \n'] 输出: Hello1 ( First : (), Second ) He

我试图拆分字符上的多行字符串,但仅当该行不包含
时。不幸的是,我找不到一种简单的方法来使用
re.split()
对字符
进行负回溯,因为
可能发生在字符串前面的另一行中

例如,我想在
上拆分下面的字符串

字符串:

Hello1 (
First : (),
Second )

Hello2 (
First 
)
['Hello1 (\nFirst : (),\nSecond', 'Hello2 (\nFirst \n']
输出:

Hello1 (
First : (),
Second )

Hello2 (
First 
)
['Hello1 (\nFirst : (),\nSecond', 'Hello2 (\nFirst \n']

可以使用
Python
,尽管本机
re
模块并非“开箱即用”

第一种选择 较新版本支持可变长度的查找,因此您可以使用

(?<=^[^:]+)\)
# pos. lookbehind making sure there's no : in that line
产生

['\nHello1 (\nFirst : (),\nSecond ', '\n\nHello2 (\nFirst \n', '']

第二种选择 或者,您可以匹配有问题的行,并让它们在
(*跳过)(*失败)
之后失败:

^[^:\n]*:.*(*SKIP)(*FAIL)|\)
# match lines with at least one : in it
# let them fail
# or match )

再次在
Python
中:

import regex as re

data = """
Hello1 (
First : (),
Second )

Hello2 (
First 
)"""

pattern = re.compile(r'(?<=^[^:]+)\)', re.MULTILINE)

parts = pattern.split(data)
print(parts)
pattern2 = re.compile(r'^[^:\n]*:.*(*SKIP)(*FAIL)|\)', re.MULTILINE)
parts2 = pattern.split(data)
print(parts2)
看。

第三种选择 好的,现在答案比之前想象的要长。在函数的帮助下,您甚至可以使用本机
re
模块来完成此操作。在这里,您需要先替换有问题的
,然后按替换项拆分:

def replacer(match):
    if match.group(1) is not None:
        return "SUPERMAN"
    else:
        return match.group(0)

pattern3 = re.compile(r'^[^:\n]*:.*|(\))', re.MULTILINE)
data = pattern3.sub(replacer, data)
parts3 = data.split("SUPERMAN")
print(parts3)

可以使用
Python
,尽管本机
re
模块并非“开箱即用”

第一种选择 较新版本支持可变长度的查找,因此您可以使用

(?<=^[^:]+)\)
# pos. lookbehind making sure there's no : in that line
产生

['\nHello1 (\nFirst : (),\nSecond ', '\n\nHello2 (\nFirst \n', '']

第二种选择 或者,您可以匹配有问题的行,并让它们在
(*跳过)(*失败)
之后失败:

^[^:\n]*:.*(*SKIP)(*FAIL)|\)
# match lines with at least one : in it
# let them fail
# or match )

再次在
Python
中:

import regex as re

data = """
Hello1 (
First : (),
Second )

Hello2 (
First 
)"""

pattern = re.compile(r'(?<=^[^:]+)\)', re.MULTILINE)

parts = pattern.split(data)
print(parts)
pattern2 = re.compile(r'^[^:\n]*:.*(*SKIP)(*FAIL)|\)', re.MULTILINE)
parts2 = pattern.split(data)
print(parts2)
看。

第三种选择 好的,现在答案比之前想象的要长。在函数的帮助下,您甚至可以使用本机
re
模块来完成此操作。在这里,您需要先替换有问题的
,然后按替换项拆分:

def replacer(match):
    if match.group(1) is not None:
        return "SUPERMAN"
    else:
        return match.group(0)

pattern3 = re.compile(r'^[^:\n]*:.*|(\))', re.MULTILINE)
data = pattern3.sub(replacer, data)
parts3 = data.split("SUPERMAN")
print(parts3)

我不确定仅仅使用正则表达式是否能够实现这一点。如果有人给出答案,我会感到惊讶。(@amitsigh)在某些正则表达式引擎中是可能的,例如在PowerShell/.Net中,
$string-split'(?m)可以工作(?我可以使用的一种方法是通过换行符
\n
拆分,然后在行字符串上使用regex lookback,但在我的case@TessellatingHeckler:厚颜无耻地将您的表达式用于较新的
regex
模块,但也提供了其他模块。我不确定是否有可能实现只是在使用正则表达式。如果有人给出答案,我会感到惊讶。(@amitsigh)在某些正则表达式引擎中是可能的,例如在PowerShell/.Net中,
$string-split'(?m)(?我可以使用的一种方法是通过换行符
\n
拆分,然后在行字符串上使用regex lookback,但在我的case@TessellatingHeckler:厚颜无耻地将您的表达式用于较新的
regex
模块,但也提供了其他模块。我从未见过
(*跳过)(*失败)
以前,这是一个非常有趣的问题。@TessellingEckler:的确,它只在特定情况下对模式进行匹配非常有效。@Jan wow,感谢您提供了不同的解决方案。像TessellingEckler一样,我从未见过
(*跳过)(*失败)的用法
。解决方案1对我遇到的更一般的问题不起作用,因此我试图找出原因。但解决方案2起作用。我从未见过
(*跳过)(*失败)
以前,这是一个非常有趣的问题。@TessellingEckler:的确,它只在特定情况下对模式进行匹配非常有效。@Jan wow,感谢您提供了不同的解决方案。像TessellingEckler一样,我从未见过
(*跳过)(*失败)的用法
。解决方案1对我遇到的更一般的问题不起作用,因此我试图找出原因。但解决方案2起了作用。