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

5
有没有一种方法可以用Python找出一个字符串是否包含某个集合中的任何一个字符?
对于单个字符来说,这很简单,但我需要检查并查看字符串是否包含一组不良字符中的任何一个。
具体而言,假设我有一个字符串:
s = 'amanaplanacanalpanama~012345'

我想看看这个字符串是否包含任何元音字母:
bad_chars = 'aeiou'

在for循环中对文件中的每一行执行此操作:
if [any one or more of the bad_chars] in s:
    do something

我正在扫描一个大文件,如果有更快的方法就最理想了。另外,不必检查每个坏字符---只要遇到一个就足以结束搜索。
我不确定是否有内置函数或容易实现的方法,但我还没有找到任何东西。任何指针将不胜感激!

1
您可能想要考虑将标题更改为“查找文件中包含特定字符的行”。 - ninjagecko
我已按照您的建议将标题更改为更具体的名称。谢谢!以前的标题非常模糊和不明确。 - BFTM
5个回答

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,例如][,或者像-那样,仅转义一些,如\w可能会赋予它新的含义)。
集合
根据str.__contains__操作是否为O(1)或O(N),如果有许多badChars,则将文本/行首先转换为集合以确保in操作为O(1)可能是有道理的。
badCharSet = set(badChars)
any((c in badChars) for c in yourString)

有可能将其简化为一行代码any((c in set(yourString)) for c in badChars), 这取决于Python编译器的智能程度。


你是否真的需要逐行操作?

对整个文件进行一次操作 O(#badchars) 或许比对文件的每一行分别进行 #lines*#badchars 次操作要快,尽管渐近常数可能相同。


4

使用 Python 的 any 函数。

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

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')

1

根据我的初步测试,这个正则表达式的速度是比使用any函数快两倍的。你应该尝试在自己的数据上使用它。

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

0
以下Python代码应该打印出任何在s中存在的bad_chars字符:
for i in vowels:
    if i in your charset:
        #do_something

你也可以使用Python内置的any函数,例如:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接