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

时间:2012-05-03 22:33:01

标签: python string search

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

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

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

s = 'amanaplanacanalpanama~012345'

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

bad_chars = 'aeiou'

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

if [any one or more of the bad_chars] in s:
    do something

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

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

5 个答案:

答案 0 :(得分:9)

any((c in badChars) for c in yourString)

any((c in yourString) for c in badChars)  # extensionally equivalent, slower

set(yourString) & set(badChars)  # extensionally equivalent, slower

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

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


的正则表达式

编辑以前我在这里编写了一个关于使用正则表达式的部分,通过re模块,以编程方式生成由单个字符类[...]组成的正则表达式并使用.finditer,需要注意的是在一切可能无法正常工作之前加上一个简单的反斜杠。事实上,在测试之后,就是这种情况,我绝对不会推荐这种方法。使用它需要对正则表达式字符类的整个(稍微复杂的)子语法进行逆向工程(例如,您可能包含\后跟w的字符,如]或{{1} }或者像[一样,只是像-那样转义一些可能会给它一个新的意义。)


根据\w操作是O(1)还是O(N),首先将文本/行转换为集合以确保str.__contains__操作为O( 1),如果你有很多badChars:

in

(根据python编译器的智能程度,可能会产生单行badCharSet = set(badChars) any((c in badChars) for c in yourString)


你真的需要逐行吗?

对于整个文件O(#badchars)执行此操作可能会更快一次,而对于文件O中的每一行(#lines * #badchars)执行此操作可能会更快一次,尽管渐近常量可能不会这样做物质

答案 1 :(得分:4)

使用python的any函数。

if any((bad_char in my_string) for bad_char in bad_chars):
    # do something 

答案 2 :(得分:2)

这应该非常有效和清晰。它使用集合:

#!/usr/bin/python

bad_chars = set('aeiou')

with open('/etc/passwd', 'r') as file_:
   file_string = file_.read()
file_chars = set(file_string)

if file_chars & bad_chars:
   print('found something bad')

答案 3 :(得分:1)

使用我的最小测试,此正则表达式的速度是any的两倍。您应该使用自己的数据进行尝试。

r = re.compile('[aeiou]')
if r.search(s):
    # do something

答案 4 :(得分:0)

以下Python代码应打印出bad_chars中的任何字符(如果它存在于s:

中)
for i in vowels:
    if i in your charset:
        #do_something

您还可以使用内置的python,使用如下示例:

>>> any(e for e in bad_chars if e in s)
True