请问如何判断多个关键词是否都不存在于指定的字符串中

2019-10-26 17:07:54 +08:00
 sunmker

这句话比较拗口,我举例解释一下。
有一个字符串 a,若干关键词(“1”、“.”、“#@”、“qq”)
我要判断是否这些关键词都不存在于字符串 a
我的写法如下,但是我想问一下有没有更加简洁的写法。

a='qwertddaivanoiasfvalfdpasfd'
if '1' not in a and '.' not in a and '#@' not in a and 'qq' not in a:
    print('t')
else :
    print('f')
5525 次点击
所在节点    Python
20 条回复
moonheart
2019-10-26 17:11:46 +08:00
把这些关键词放到数组里去遍历判断
eason1874
2019-10-26 17:17:23 +08:00
正则匹配不行吗?我记得可以的吧。
CEBBCAT
2019-10-26 17:56:14 +08:00
手写的话,应该循环 a_str,同时把关键词排序,然后二分匹配,可以节省一些时间。原来是 n*m,现在是 n*log m

但还是建议看看正则可不可以解决
CEBBCAT
2019-10-26 18:01:26 +08:00
@CEBBCAT 我这是单字符的做法,字符串匹配有那个什么算法。不过这个问题应该请教 Livid。。。逃
xuanbg
2019-10-26 18:01:56 +08:00
两层循环正则匹配
wzwwzw
2019-10-26 18:09:10 +08:00
a='qwertddaivanoiasfvalfdpasfd'
strs = ["1",".","#@","qq"]

results = [False for i in strs if i in a]
if len(results) == 0:
print("not in")
else:
print("in ")
wzwwzw
2019-10-26 18:10:22 +08:00
a='qwertddaivanoiasfvalfdpasfd'
strs = ["1",".","#@","qq"]
results = [False for i in strs if i in a]
if len(results) == 0:print("not in")
else:print("in ")
necomancer
2019-10-26 18:54:09 +08:00
key = [....]
s = '....'
for key in keys:
....if key in s:
........print('t')
........break
else:
....print('f')
Origami404
2019-10-26 18:56:30 +08:00
ac 自动机?
ClericPy
2019-10-26 18:58:33 +08:00
考虑性能就是 AC 自动机
考虑原生就是正则表达式里的零宽断言
uprightzy
2019-10-27 09:22:15 +08:00
写一个函数能判断一个关键字是否在字符串里,然后把需要判断的关键字丢到一个 list 里,最后用 map(func,list)就能帮你把 list 中每个参数传进函数中执行,全部执行结果会被打包成一个 list 返回。
mskf
2019-10-28 03:19:20 +08:00
/1|\.|#@|qq/.test(a)
mskf
2019-10-28 03:24:36 +08:00
@mskf 前面少了个非,不过不影响,我觉得你是不是想问“都存在”?
babyrjw
2019-10-28 09:39:45 +08:00
这是关键词过滤吧,字典树,AC 自动机
14cheese
2019-10-28 19:07:45 +08:00
是这样吗?

a='qwertddaivanoiasfvalfdpasfd
patterns = (‘a’, ‘b’)
if all([ s not in a for s in patterns]):
# do something
pass
sunmker
2019-10-28 23:04:08 +08:00
谢谢各位大佬提出建议,我尽最大努力都尝试了一下
首先,正则可以实现我这个需求,我用 search 来实现「都不存在」,用 findall 来实现「都存在」

其次,看了一下 AC 自动机,网上资料不多,我使用了一篇文章的代码实现,但是没有我想象中的代码那么简洁(即使仔细去一下代码优化)

最后 @mskf 这个 Python 正则应该没有 test 的方法,js 里面是可以的

==========
我刚开始是想问有没有我所不知道的高级语法糖可以实现这个功能,因为我觉得用 Python 要优雅,结果发现好像没有。但是集思广益,收获也很多,打开了我的思路,谢谢各位
ClericPy
2019-10-29 00:43:54 +08:00
@sunmker
AC 自动机有现成的用 C 实现的, 直接 pip 装上用就好了, 自己写费那劲又不如 C 的快. 它的好处就是, blacklist 特别大的情况下, 性能非常不错, 做敏感词过滤 /替换的时候用的很爽.

语法糖的话, 目测一般就是用函数式那俩 all 和 any, 以及 not any. 因为 Python3 里面这俩货都改生成器了, 所以内存和速度都有点优化

零宽断言不见得特别有用, 不过好玩啊
import re

# 都存在
print(re.search(r'^(?=.*中文)(?=.*英语).*$', '英语不如中文不'))
print(re.search(r'^(?=.*中文)(?=.*英语).*$', '英语不如不'))
print(re.search(r'^(?=.*中文)(?=.*英语).*$', '不如不'))
# <re.Match object; span=(0, 7), match='英语不如中文不'>
# None
# None
# 都不存在
print(re.search(r'^(?!.*中文)(?!.*英语).*$', '英语不如中文不'))
print(re.search(r'^(?!.*中文)(?!.*英语).*$', '英语不如不'))
print(re.search(r'^(?!.*中文)(?!.*英语).*$', '不如不'))
# None
# None
# <re.Match object; span=(0, 3), match='不如不'>
solxnp
2019-10-31 18:07:29 +08:00
str = 'sdfjsdlkfjldgjldsgsdlg'
keyword = ['s', 'c', 'b', 'o']
result = all([i in str for i in keyword])
solxnp
2019-10-31 18:13:34 +08:00
哦 看了下 你是想要都不存在 那改下就好
str = 'sdfjsdlkfjldgjldsgsdlg'
keyword = ['s', 'c', 'b', 'o']
result = all([i not in str for i in keyword]) # 只要有一个存在 结果就为 False 全部不存在 结果为 True
yucongo
2019-11-01 21:20:05 +08:00
kw = ("1", ".", "#@", "qq")
all(map(lambda ele: ele not in a, kw))

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/613249

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX