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起了作用。