
这句话比较拗口,我举例解释一下。
有一个字符串 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') 1 moonheart Oct 26, 2019 把这些关键词放到数组里去遍历判断 |
2 eason1874 Oct 26, 2019 正则匹配不行吗?我记得可以的吧。 |
3 CEBBCAT Oct 26, 2019 via Android 手写的话,应该循环 a_str,同时把关键词排序,然后二分匹配,可以节省一些时间。原来是 n*m,现在是 n*log m 但还是建议看看正则可不可以解决 |
5 xuanbg Oct 26, 2019 两层循环正则匹配 |
6 wzwwzw Oct 26, 2019 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 ") |
7 wzwwzw Oct 26, 2019 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 ") |
8 necomancer Oct 26, 2019 key = [....] s = '....' for key in keys: ....if key in s: ........print('t') ........break else: ....print('f') |
9 Origami404 Oct 26, 2019 via Android ac 自动机? |
10 ClericPy Oct 26, 2019 考虑性能就是 AC 自动机 考虑原生就是正则表达式里的零宽断言 |
11 uprightzy Oct 27, 2019 via Android 写一个函数能判断一个关键字是否在字符串里,然后把需要判断的关键字丢到一个 list 里,最后用 map(func,list)就能帮你把 list 中每个参数传进函数中执行,全部执行结果会被打包成一个 list 返回。 |
12 mskf Oct 28, 2019 /1|\.|#@|qq/.test(a) |
14 babyrjw Oct 28, 2019 这是关键词过滤吧,字典树,AC 自动机 |
15 14cheese Oct 28, 2019 via iPhone 是这样吗? a='qwertddaivanoiasfvalfdpasfd patterns = (‘a’, ‘b’) if all([ s not in a for s in patterns]): # do something pass |
16 sunmker OP 谢谢各位大佬提出建议,我尽最大努力都尝试了一下 首先,正则可以实现我这个需求,我用 search 来实现「都不存在」,用 findall 来实现「都存在」 其次,看了一下 AC 自动机,网上资料不多,我使用了一篇文章的代码实现,但是没有我想象中的代码那么简洁(即使仔细去一下代码优化) 最后 @mskf 这个 Python 正则应该没有 test 的方法,js 里面是可以的 ========== 我刚开始是想问有没有我所不知道的高级语法糖可以实现这个功能,因为我觉得用 Python 要优雅,结果发现好像没有。但是集思广益,收获也很多,打开了我的思路,谢谢各位 |
17 ClericPy Oct 29, 2019 @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='不如不'> |
18 solxnp Oct 31, 2019 str = 'sdfjsdlkfjldgjldsgsdlg' keyword = ['s', 'c', 'b', 'o'] result = all([i in str for i in keyword]) |
19 solxnp Oct 31, 2019 哦 看了下 你是想要都不存在 那改下就好 str = 'sdfjsdlkfjldgjldsgsdlg' keyword = ['s', 'c', 'b', 'o'] result = all([i not in str for i in keyword]) # 只要有一个存在 结果就为 False 全部不存在 结果为 True |
20 yucongo Nov 1, 2019 kw = ("1", ".", "#@", "qq") all(map(lambda ele: ele not in a, kw)) |