【问题标题】:Regex invert selection正则表达式反转选择
【发布时间】:2021-05-06 15:17:14
【问题描述】:

我环顾四周,但无法找到这个问题的答案。

我正在尝试从重复一定次数的字符串 except 空格中选择所有内容。我找到了一个选择空格的正则表达式,我希望的是一种简单的方法来获得与此完全相反的结果,但我还没有找到一种方法来做到这一点。如果这很重要,我最终会在 python 中实现它。

下面是我的测试字符串、当前的正则表达式,以及我正在使用的正则表达式测试站点的链接。

Current regex

测试字符串:

'All: Day and Night                                                                                                                                                                                                                                             Vulnerabilities\\Personnel vulnerabilities\\Outdoor vulnerability                                                                                                                                                                                                1E-09                                                                                                                                                                                                                                                          /AvgeYear                                                                                                                                                                                                                                                      \x1a'

正则表达式:

[ ]{50,}

【问题讨论】:

标签: python regex parsing inverse-match


【解决方案1】:

您可以匹配 1+ 个非空白字符,并可选择重复 1-49 个空格和 1+ 个非空白字符。

\S+(?:[ ]{1,49}\S+)*

查看regex demo | Python demo

例子

from pprint import pprint
import re

regex = r"\S+(?:[ ]{1,49}\S+)*"
s = "All: Day and Night                                                                                                                                                                                                                                             Vulnerabilities\\\\Personnel vulnerabilities\\\\Outdoor vulnerability                                                                                                                                                                                                1E-09                                                                                                                                                                                                                                                          /AvgeYear                                                                                                                                                                                                                                                      \\x1a'"

pprint(re.findall(regex, s))

输出

['All: Day and Night',
 'Vulnerabilities\\\\Personnel vulnerabilities\\\\Outdoor vulnerability',
 '1E-09',
 '/AvgeYear',
 "\\x1a'"]

【讨论】:

    【解决方案2】:

    您可以使用相同的正则表达式并将 re.sub 匹配到一个空格。

    re.sub(r'[ ]{50,}', ' ', string)
    #'All: Day and Night Vulnerabilities\\Personnel vulnerabilities\\Outdoor vulnerability 1E-09 /AvgeYear \x1a'
    

    如果您想将其作为列表,只需使用相同的正则表达式并使用 re.split() 而不是 re.sub()

    re.split(r'[ ]{50,}', string)
    #['All: Day and Night', 'Vulnerabilities\\Personnel vulnerabilities\\Outdoor vulnerability', '1E-09', '/AvgeYear', '\x1a']
    

    【讨论】:

    • 这也让我到达那里,虽然我得到了一个返回的字符串,这并不理想,但我应该指定
    • @SuperStew 你想要list吗?
    • 是的,这对我的其余代码更好
    • @SuperStew 更新到输出列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 2017-12-07
    • 2015-01-11
    • 2016-01-11
    • 2010-09-16
    相关资源
    最近更新 更多