【问题标题】:how to match a string which is not (double underscored and double dashed and spaces)如何匹配不是的字符串(双下划线和双破折号和空格)
【发布时间】:2016-03-23 03:42:06
【问题描述】:

我想匹配任何不包含 -- 和 __ 和空格的字符串。

应该匹配的字符串

asd_asd-qwem
asd_-asd-_qwem
asdasdqwem

不应匹配的字符串

asd_asd--qwem
asd__asd-qwem
asd__asd--qwem

【问题讨论】:

  • 字符串的其余部分呢?它只是字母、字母和数字,还是什么?字符串可以以- 或_ 开头或结尾吗?您是针对独立字符串进行匹配,还是在更大的字符串中搜索匹配项?
  • 说空格的意思是可以接受一个空格吗?如果不是,any space 会比 spaces 更准确。

标签: python regex search


【解决方案1】:

由于您添加了regex 标签,因此我的解决方案是相同的。

正则表达式: ^(?!.*(--|__| +)).+$

说明:

  • (?!.*(--|__| +)) 将寻找__、-- 或spaces 的缺席。如果它们都不存在,则整个字符串都是匹配的。

Regex101 Demo

【讨论】:

  • 有没有办法将匹配的模式分组到一个命名组中?就像 (?p) 的工作原理一样?
  • @noob:使用惰性量词和负量词中的积极前瞻只是一步减少(-40):^(?!.*?(?=--|__| +)).+$
  • @Jan:谢谢。但是,我将保留前一个作为答案,因为那时我将不得不向 OP 解释嵌套的 lookaround,这会有点复杂。我鼓励你添加这个作为你的答案来解释那个。
  • @lionel319:是的,你可以使用它。更多关于named groups
【解决方案2】:

看来你可以这样做:

if not ('--' in s or '__' in s):
    ...

或者,等效地:

if '--' not in s and '__' not in s:
    ...

【讨论】:

  • 啊,我很愚蠢。我不需要 re.search() 来实现这一点。谢谢。 :)
【解决方案3】:

非正则表达式的替代方法可能涉及检查字符串中的子字符串:

>>> l = ["asd_asd-qwem", "asd_-asd-_qwem", "asdasdqwem", "asd_asd--qwem", "asd__asd-qwem", "asd__asd--qwem"]
>>> c = ["--", "__", " "]
>>> [s for s in l if not any(item in s for item in c)]
['asd_asd-qwem', 'asd_-asd-_qwem', 'asdasdqwem']

其中c 定义了我们不想在字符串中看到的子字符串列表。

【讨论】:

  • 啊,我很愚蠢。我不需要 re.search() 来实现这一点。谢谢。 :)
【解决方案4】:

如果你真的需要一个正则表达式,你可以想出一个。喜欢:

^(?!.*?(?=--|__| +)).+$

这分解为以下几点:

  • ^ 确保将字符串锚定到开头
  • (?! 是一个否定的前瞻
  • .*? 懒惰地匹配除换行符以外的任何字符
  • (?= 是 正 前瞻,带有 -- 或 __ 或空格之一
  • .+ 至少匹配一个字符
  • $ 确保字符串在这里结束

嵌套的前瞻可以减少正则表达式引擎的步骤(从而使引擎更快地结束),请参阅a demo on regex101.com(从@noob 劫持,抱歉 :) .
在Python 中,这将是:

import re
rx = r'^(?!.*?(?=--|__| +)).+$'
string = """
asd_asd-qwem
asd_-asd-_qwem
asdasdqwem

asd_asd--qwem
asd__asd-qwem
asd__asd--qwem
"""

for match in re.finditer(rx, string, re.MULTILINE):
    print match.group(0)
# asd_asd-qwem, asd_-asd-_qwem, asdasdqwem

见a demo on ideone.com.

【讨论】:

    【解决方案5】:

    下面的模式应该很容易理解:

    ^(?:[^_\s-]|_(?!_)|-(?!-))+$
    

    正则表达式解释:

    ^               # Assert start of line  
     (?:            # Non-capturing group starts
        [^_\s-]|    # match a character except underscore, space, dash; OR
        _(?!_)|     # match underscore, but not followed by another underscore; OR
        -(?!-)      # match dash, but not followed by another dash
     )              # Non-capturing group ends
      +             # Repeat above pattern 1 or more times
    $               # Assert end of line    
    

    REGEX DEMO.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 2018-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多