我想匹配任何不包含 - 和__和空格的字符串。
应匹配的字符串
asd_asd-qwem
asd_-asd-_qwem
asdasdqwem
不匹配的字符串
asd_asd--qwem
asd__asd-qwem
asd__asd--qwem
答案 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
答案 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