![](/img/trans.png)
[英]Read lines from file and subsequently only write those lines to the file which don't contain a certain phrase
[英]Find which lines in a file contain certain characters
有没有办法找出一个字符串是否包含一组python中的任何一个字符?
使用单个字符执行此操作非常简单,但我需要检查并查看字符串是否包含任何一组错误字符。
具体来说,假设我有一个字符串:
s = 'amanaplanacanalpanama~012345'
我想看看字符串是否包含任何元音:
bad_chars = 'aeiou'
并在文件中每一行的for循环中执行此操作:
if [any one or more of the bad_chars] in s:
do something
我正在扫描一个大文件,所以如果有更快的方法,这将是理想的。 此外,不是每个坏人都必须被检查---只要遇到一个足以结束搜索的人。
我不确定是否有内置函数或简单的方法来实现它,但我还没有遇到过任何问题。 任何指针将非常感谢!
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),它可能是有道理的文本/线先转换成一组,以确保in
操作O(1),如果你有很多badChars:
badCharSet = set(badChars)
any((c in badChars) for c in yourString)
(根据python编译器的智能程度,可能可以为any((c in set(yourString)) for c in badChars)
)
你真的需要逐行吗?
对于整个文件O(#badchars)执行此操作可能更快一次,而对于文件O中的每一行(#lines * #badchars)执行此操作可能更快,尽管渐近常量可能无关紧要。
使用python的any
函数。
if any((bad_char in my_string) for bad_char in bad_chars):
# do something
这应该非常有效和清晰。 它使用集合:
#!/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')
这个正则表达式快两倍, any
与我的最小的测试。 您应该使用自己的数据进行尝试。
r = re.compile('[aeiou]')
if r.search(s):
# do something
以下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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.