我有一个像这样定义的多行字符串:
foo = """
this is
a multi-line string.
"""
Run Code Online (Sandbox Code Playgroud)
这个字符串我们用作我正在编写的解析器的测试输入.解析器函数接收一个file-object作为输入并迭代它.它也next()直接调用方法来跳过行,所以我真的需要一个迭代器作为输入,而不是迭代.我需要一个迭代器,迭代遍历该字符串的各个行,就像file一个文本文件的行一样.我当然可以这样做:
lineiterator = iter(foo.splitlines())
Run Code Online (Sandbox Code Playgroud)
有更直接的方法吗?在这种情况下,字符串必须遍历一次以进行拆分,然后再由解析器遍历.在我的测试用例中没关系,因为那里的字符串很短,我只是出于好奇而问.Python为这些东西提供了许多有用且高效的内置插件,但我找不到任何适合这种需求的东西.
python是否有内置(意味着在标准库中)对产生迭代器而不是列表的字符串进行拆分?我想到了很长的字符串,不需要消耗大部分字符串.
如果在Python 字符串.split()上使用字符串,则返回字符串列表.这些已拆分的子字符串是其父字符串部分的副本.
是否有可能获得一些更便宜的切片对象,只保留参考,偏移和长度分割出的位?
是否有可能有一些"字符串视图"来提取和处理这些子字符串,就像它们是字符串而没有复制它们的字节一样?
(我问,因为我有很大的字符串,我想要切片,偶尔会耗尽内存;删除副本将是一个廉价的配置文件引导的胜利.)
给定一个列表["one", "two", "three"],如何确定每个单词是否存在于指定的字符串中?
单词列表很短(在我的情况下少于20个单词),但要搜索的字符串非常庞大(每次运行400,000个字符串)
我目前的实现用于re寻找匹配,但我不确定它是否是最佳方式.
import re
word_list = ["one", "two", "three"]
regex_string = "(?<=\W)(%s)(?=\W)" % "|".join(word_list)
finder = re.compile(regex_string)
string_to_be_searched = "one two three"
results = finder.findall(" %s " % string_to_be_searched)
result_set = set(results)
for word in word_list:
if word in result_set:
print("%s in string" % word)
Run Code Online (Sandbox Code Playgroud)
我的解决方案存在问题
可能更简单的实施:
if word in string_to_be_searched.但如果你正在寻找"三个"它不能处理"三人组"更新:
我接受了Aaron Hall的回答/sf/answers/1520322751/,因为根据Peter Gibson的基准测试/sf/answers/1521953331/这个简单的版本具有最佳性能.如果您对此问题感兴趣,可以阅读所有答案并获得更好的视图.
实际上我忘记在我原来的问题中提到另一个约束.这个词可以是一个短语,例如:word_list = ["one day", "second day"].也许我应该问另一个问题.
我正在使用正则表达式来查找文本正文中出现的字符串模式.一旦我发现字符串模式出现,我想在字符串之前和之后得到x个单词(x可以小到4,但如果仍然有效则最好是~10).
我目前正在使用正则表达式查找所有实例,但偶尔会挂起.有没有更有效的方法来解决这个问题?
这是我目前的解决方案:
sub = r'(\w*)\W*(\w*)\W*(\w*)\W*(\w*)\W*(%s)\W*(\w*)\W*(\w*)\W*(\w*)\W*(\w*)' % result_string #refind string and get surrounding += 4 words
surrounding_text = re.findall(sub, text)
for found_text in surrounding_text:
result_found.append(" ".join(map(str,found_text)))
Run Code Online (Sandbox Code Playgroud) 这是一个具体的例子:
my_dict={k:int(encoded_value)
for (k,encoded_value) in
[encoded_key_value.split('=') for encoded_key_value in
many_encoded_key_values.split(',')]}
Run Code Online (Sandbox Code Playgroud)
问题是关于内部列表[],是否可以避免,例如:
# This will not parse
my_dict={k:int(encoded_value)
for (k,encoded_value) in
encoded_key_value.split('=') for encoded_key_value in
many_encoded_key_values.split(',')}
Run Code Online (Sandbox Code Playgroud)
...,这是无效的语法:
NameError: name 'encoded_key_value' is not defined
样本数据: aa=1,bb=2,cc=3,dd=4,ee=-5