正则表达式: 找出不含(排除)某个字符串的所有

Match string not containing string

Given a list of strings (words or other characters), only return the strings that do not match.


以正则表达式 ^((?!badword).)*$ 搜索以下内容将会得到除1、4行以外的所有内容。此表达式对于log搜索比较有用。

badword可以替换为一组字符串,如(ECSdk|MOS),表达式^((?!(ECSdk|MOS)).)*$意为排除ECSdk和MOS 所在的行。

badword
test
one two
abadwords

three


参考:

https://www.regextester.com/15


### 如何使用正则表达式匹配不含特殊字符的内容 为了实现仅匹配不包含某些特殊字符的字符串,可以采用负向前瞻断言来构建正则表达式模式。具体来说,在Python中可以通过定义一个否定式的字符集或者通过使用零宽度负预测先行断言`(?!...)`的方式达成目的。 当目标是从一段文本里提取出那些完全由非指定特殊符号构成的部分时,一种方法是创建一个能够描述允许存在的字符范围并确保整个串都遵循此规则的模式。例如,如果希望排除所有的标点符号和其他非字母数字字符,则可编写如下形式的正则表达式: ```python import re def match_non_special(text): pattern = r'^[^\W_]+$' # 只接受大小写字母和数字,拒绝任何其他字符[^1] matches = re.findall(pattern, text) return matches ``` 上述代码片段中的`^[^\W_]$`表示从头至尾只允许存在单词字符(即大写A-Z、小写a-z、下划线_以及0-9),而`\W`代表所有非单词字符;因此`[^\W_]`实际上就是指除了这些之外的一切都不被接纳。加上量词`+`意味着至少有一个这样的字符,并且由于有锚定符`^`与`$`的存在,所以会强制要求整个输入都要满足条件而不是部分子序列。 另外一种情况可能是想要过滤掉含有某几个特定特殊字符的字符串而不关心其余成分。这时就可以借助于前面提到过的零宽断言技术了。比如要找出既无单引号也无双引号更没有反斜杠在内的项,那么对应的正则应该是这样设计的: ```python def exclude_specific_chars(text): pattern = r'^(?!.*["\'\\]).*$' # 排除含有的双引号、单引号或反斜杠的任意长度字符串[^2] matches = re.findall(pattern, text) return matches ``` 这里的关键在于`(?!.*["\'\\])`这部分,它是一个负向前瞻断言,用来确认当前位置之后不存在紧跟其后的任一指定字符。“.”用于匹配任意单一字符,“*”则是贪婪型重复操作符,组合起来就构成了对后续可能出现元素的一个全面扫描机制。 #### 测试案例 考虑下面的例子以验证上面两个函数的行为是否符合预期: ```python test_strings = ["hello", "world!", "foo_bar", 'say "hi"', "no special char"] print([s for s in test_strings if match_non_special(s)]) # 输出: ['hello'] print([s for s in test_strings if exclude_specific_chars(s)]) # 输出: ['hello', 'world!', 'foo_bar'] ``` 可以看到,第一个列表 comprehension 调用了 `match_non_special()` 函数,返回的是没有任何非字母数字字符组成的字符串;第二个调用 `exclude_specific_chars()` 的结果保留下来了那些内部确实缺少所列三种特殊标记的对象。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值