Python Regex在单行上反向/负匹配而不是在多行上,不使用SPLIT(),并且不测试以前的匹配组

2024-04-27 20:50:34 发布

您现在位置:Python中文网/ 问答频道 /正文

结合Python的Regex(re库)和逆/负匹配,我读过的每一个主题都集中在多行字符串上,而不是单一的行字符串。在

除了http://www.regextester.com/15使用JavaScript正则表达式库显示整个组(/g)的匹配项之外,它的行为与Python的re库不同(显然,根据https://rexegg.com/在Python中还有另一个regex库我还不想使用),我还想知道是否有一种方法可以使用它。”关于芬德尔“(是的搜索尽管我知道关于芬德尔)做2件事。返回以下qw中不包含字符串“hede”的所有单个字符串。2返回不包含字符串“hede”的所有单个字符串,并断开两边包含字符串“hede”的字符串。在

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

场景1期望输出(排除包含“hede”的所有字符串):

^{pr2}$

场景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等于以下值,是否有可能找到解决方案:

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

一。在

谢谢你们的帮助。在

另外,在每一个帖子里我都读到了“^(?)?!赫德)。*$”或“^(?)?!。福奥)。“已出现多行帖子。当然,这在Python中不太好用,但是我尝试过用它们来胡闹,但是没有用。在

非常感谢你们的帮助!在


Tags: 字符串resotitihohohahaqwhihi
1条回答
网友
1楼 · 发布于 2024-04-27 20:50:34

我建议利用仅返回捕获文本的^{}功能:

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)+)-匹配并将一个或多个非空白字符捕获到组1中,这些字符不是hede序列的起始点。在

请注意,如果使用PyPi ^{} modile,则可以使用PCRE-like verbs ^{}

^{pr2}$

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

相关问题 更多 >