如何匹配不是(双下划线和双虚线和空格)的字符串

时间:2016-03-23 03:42:06

标签: python regex search

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

应匹配的字符串

asd_asd-qwem
asd_-asd-_qwem
asdasdqwem

不匹配的字符串

asd_asd--qwem
asd__asd-qwem
asd__asd--qwem

5 个答案:

答案 0 :(得分:3)

由于您在此处添加了regex标记,因此我的解决方案也是如此。

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

<强>解释

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

<强> Regex101 Demo

答案 1 :(得分:2)

好像你可以这么做:

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

或等同地:

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

答案 2 :(得分:2)

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

>>> 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定义了我们不希望在字符串中看到的子字符串列表。

答案 3 :(得分:2)

如果你真的需要一个正则表达式,你可以拿出来......像:

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

这分解为以下内容:

  • ^确保将字符串锚定到开头
  • (?!否定预测
  • .*?匹配除了换行符之外的任何字符
  • (?=是一个正面预测,其中一个--__或空格
  • .+至少匹配一个字符
  • $确保字符串在此处结束

嵌套前瞻是为了减少正则表达式引擎的步骤(从而使引擎更快地结束),参见 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.

答案 4 :(得分:0)

以下模式应该易于理解:

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

REGEX说明:

^               # 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.