Python 正则表达式 inverse/negative 在单行上匹配,而不是在多行上匹配,不使用 SPLIT(),并且不测试以前的匹配组

Python Regex inverse/negative match on a SINGLE line NOT on multiple lines, NOT USING SPLIT(), and NOT testing previous match groups

我读过的每个结合 Python 的正则表达式(重新库)和 Inverse/Negative 匹配的主题都集中在多行字符串上,而不是 SINGLE 行字符串。

除了 http://www.regextester.com/15 uses a JavaScript regex library displaying matches for the entire group (/g) and behaves differently from Python's re library (apparently according to https://rexegg.com/ Python 中还有另一个正则表达式库,我现在还不想使用),我想知道是否有办法使用 "re.findall"(是的 re.search 虽然我知道 re.findall)做两件事:1. Return 所有不包含字符串 "hede" in qw 的单独字符串以下。 2. Return 所有不包含字符串 "hede" 的单独字符串,并在任一侧断开包含字符串 "hede" 的字符串。

>>> qw = "hoho hihi haha hede rara a rere titi so whdhdskhdshede wekjewhkwqjhededjfjfj so kjkfdjkdnekjdhide b hede kdjkdld"

场景 1 所需输出(排除所有包含 "hede" 的字符串):

>>> qw ='hoho hihi haha hede rara a rere titi so whdhdskhdshede wekjewhkwqjhededjfjfj so kjkfdjkdnekjdhide b hede kdjkdld'
>>> re.findall('{SOMETHING_THAT_EXCLUDES_ALL_STRINGS_COTAINING_hede}', qw)
['hoho', 'hihi', 'haha', 'rara', 'a', 'rere', 'titi', 'so', 'so', 'kjkfdjkdnekjdhide', 'b', 'kdjkdld']

场景 2 所需的输出(包括不包含 "hede" 的所有内容以及在 "hede" 处包含 "hede" 的中断字符串):

>>> qw ='hoho hihi haha hede rara a rere titi so whdhdskhdshede wekjewhkwqjhededjfjfj so kjkfdjkdnekjdhide b hede kdjkdld'
>>> re.findall('{SOMETHING_THAT_INCLUDES_ALL_STRINGS_NOT_COTAINING_hede_AND_BREAKS_THEM_IF_THEY_DO}', qw)
['hoho', 'hihi', 'haha', 'rara', 'a', 'rere', 'titi', 'so', 'whdhdskhds', 'wekjewhkwqj', 'djfjfj', 'so' 'kjkfdjkdnekjdhide', 'b', 'kdjkdld']

我最近的效率太低了:

>>> qw ='hoho hihi haha hede rara a rere titi so whdhdskhdshede wekjewhkwqjhededjfjfj so kjkfdjkdnekjdhide b hede kdjkdld'
>>> re.findall('[\S]+(?=hede)|(?<=hede )[\S]+|(?<=hede)[\S]+|[\S]+(?= hede)|[\S]+(?=hede )|(?<= hede)[\S]+', qw)
['haha', 'rara', 'whdhdskhds', 'wekjewhkwqj', 'djfjfj', 'b', 'kdjkdld']

请记住,qw 在术语之间有一个 space。我忍不住想知道如果间距存在差异是否有可能解决方案,即如果 qw 等于以下值:

>>> qw = "hoho hihi   haha    hede rara     a rere titi so   whdhdskhdshede wekjewhkwqjhededjfjfj  so kjkfdjkdnekjdhide        b     hede   kdjkdld"

.

感谢大家的帮助。

此外,在每个线程中,我都阅读了“^(?!hede).*$”或“^(?!.foo).”的变体提出多行职位。当然,这在 Python 中效果不佳,但我尝试过这些无济于事。

非常感谢你们的帮助!

我建议利用仅返回捕获文本的 re.findall 功能:

If one or more groups are present in the pattern, return a list of groups; this will be a list of tuples if the pattern has more than one group. Empty matches are included in the result unless they touch the beginning of another match.

因此,您可以匹配并捕获您需要的内容,然后只匹配您需要的内容跳过。请参阅 Python 演示:

import re
qw ='hoho hihi haha hede rara a rere titi so whdhdskhdshede wekjewhkwqjhededjfjfj so kjkfdjkdnekjdhide b hede kdjkdld'
rx = r'hede|((?:(?!hede)\S)+)'
results = re.findall(rx, qw)
print(filter(None, results))
# => ['hoho', 'hihi', 'haha', 'rara', 'a', 'rere', 'titi', 'so', 'whdhdskhds', 'wekjewhkwqj', 'djfjfj', 'so', 'kjkfdjkdnekjdhide', 'b', 'kdjkdld']

参见Python demo

由于hede没有被捕获,所以不返回,但是由于有1个捕获组,没有参与匹配,所以每次非捕获时都会在结果列表中添加一个空字符串-捕获的模式匹配。

图案详情

  • hede - 匹配 hede
  • | - 或
  • ((?:(?!hede)\S)+) - 将一个或多个不是 hede 序列起点的非空白字符匹配并捕获到组 1 中。

请注意,如果您使用 PyPi regex modile, you may use the PCRE-like verbs (*SKIP)(*F)

>>> import regex
>>> qw ='hoho hihi haha hede rara a rere titi so whdhdskhdshede wekjewhkwqjhededjfjfj so kjkfdjkdnekjdhide b hede kdjkdld'
>>> print(regex.findall(r'hede(*SKIP)(*F)|((?:(?!hede)\S)+)', qw))
['hoho', 'hihi', 'haha', 'rara', 'a', 'rere', 'titi', 'so', 'whdhdskhds', 'wekjewhkwqj', 'djfjfj', 'so', 'kjkfdjkdnekjdhide', 'b', 'kdjkdld']

那么,就不需要filter结果了。