查找文件中的哪些行包含某些字符

BFT*_*FTM 5 python string search

有没有办法找出一个字符串是否包含一组python中的任何一个字符?

使用单个字符执行此操作非常简单,但我需要检查并查看字符串是否包含任何一组错误字符.

具体来说,假设我有一个字符串:

s = 'amanaplanacanalpanama~012345'
Run Code Online (Sandbox Code Playgroud)

我想看看字符串是否包含任何元音:

bad_chars = 'aeiou'
Run Code Online (Sandbox Code Playgroud)

并在文件中每一行的for循环中执行此操作:

if [any one or more of the bad_chars] in s:
    do something
Run Code Online (Sandbox Code Playgroud)

我正在扫描一个大文件,所以如果有更快的方法,这将是理想的.此外,不是每个坏人都必须被检查---只要遇到一个足以结束搜索的人.

我不确定是否有内置函数或简单的方法来实现它,但我还没有遇到过任何问题.任何指针将非常感谢!

nin*_*cko 9

any((c in badChars) for c in yourString)
Run Code Online (Sandbox Code Playgroud)

要么

any((c in yourString) for c in badChars)  # extensionally equivalent, slower
Run Code Online (Sandbox Code Playgroud)

要么

set(yourString) & set(badChars)  # extensionally equivalent, slower
Run Code Online (Sandbox Code Playgroud)

"只要遇到一个足以结束搜索的人." - 如果您使用第一种方法,则会出现这种情况.

你说你关心的是性能:除非你处理大量的数据,否则性能不应成为问题.如果遇到问题,可以尝试:


正则表达式

编辑以前我在这里编写了一个关于使用re正则表达式的部分,通过模块,以编程方式生成由单个字符类[...]和使用组成的正则表达式,并.finditer注意在一切可能无法正常工作之前放入一个简单的反斜杠.事实上,在测试之后,就是这种情况,我绝对不会推荐这种方法.(例如像你可能有字符使用,这将需要逆向工程的整个(稍微复杂)的正则表达式字符类的子语法\,然后w,像][,或类似-,并且仅仅是逃避一些喜欢\w可以赋予它新的含义).


根据str.__contains__操作是O(1)还是O(N in),如果您有许多badChars ,首先将文本/行转换为集合以确保操作为O(1)可能是合理的:

badCharSet = set(badChars)
any((c in badChars) for c in yourString)
Run Code Online (Sandbox Code Playgroud)

(any((c in set(yourString)) for c in badChars)根据python编译器的智能程度,可能会使其成为一个单行程序)


你真的需要逐行吗?

对于整个文件O(#badchars)执行此操作可能更快一次,而对于文件O(#lines*#badchars)中的每一行执行此操作可能更快一次,尽管渐近常量可能无关紧要.