相关疑难解决方法(0)

迭代字符串的行

我有一个像这样定义的多行字符串:

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 string iterator

110
推荐指数
3
解决办法
11万
查看次数

将字符串拆分为迭代器

python是否有内置(意味着在标准库中)对产生迭代器而不是列表的字符串进行拆分?我想到了很长的字符串,不需要消耗大部分字符串.

python string iterator split

23
推荐指数
2
解决办法
1万
查看次数

通过引用切片到不可变的字符串而不是复制

如果在Python 字符串.split()上使用字符串,则返回字符串列表.这些已拆分的子字符串是其父字符串部分的副本.

是否有可能获得一些更便宜的切片对象,只保留参考,偏移和长度分割出的位?

是否有可能有一些"字符串视图"来提取和处理这些子字符串,就像它们是字符串而没有复制它们的字节一样?

(我问,因为我有很大的字符串,我想要切片,偶尔会耗尽内存;删除副本将是一个廉价的配置文件引导的胜利.)

python

15
推荐指数
2
解决办法
2793
查看次数

Python:如何确定字符串中是否存在单词列表

给定一个列表["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)

我的解决方案存在问题

  1. 它将搜索到字符串的结尾,尽管单词可能出现在字符串的前半部分
  2. 为了克服先行断言的限制(我不知道如何表达"当前匹配前的字符应该是非单词字符,或字符串的开头"),我在字符串I之前和之后添加了额外的空格需要被搜查.
  3. 前瞻断言引入的其他性能问题?

可能更简单的实施:

  1. 只需遍历单词列表并执行操作if word in string_to_be_searched.但如果你正在寻找"三个"它不能处理"三人组"
  2. 使用一个正则表达式搜索一个单词.我仍然不确定性能,以及多次搜索字符串的可能性.

更新:

我接受了Aaron Hall的回答/sf/answers/1520322751/,因为根据Peter Gibson的基准测试/sf/answers/1521953331/这个简单的版本具有最佳性能.如果您对此问题感兴趣,可以阅读所有答案并获得更好的视图.

实际上我忘记在我原来的问题中提到另一个约束.这个词可以是一个短语,例如:word_list = ["one day", "second day"].也许我应该问另一个问题.

python regex

10
推荐指数
2
解决办法
2万
查看次数

在文本中使用字符串之前和之后获取单词的有效方法(python)

我正在使用正则表达式来查找文本正文中出现的字符串模式.一旦我发现字符串模式出现,我想在字符串之前和之后得到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)

python regex string

7
推荐指数
2
解决办法
6471
查看次数

是多级列表理解中必需的中间列表

这是一个具体的例子:

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

python python-3.x python-3.6

3
推荐指数
1
解决办法
71
查看次数

标签 统计

python ×6

string ×3

iterator ×2

regex ×2

python-3.6 ×1

python-3.x ×1

split ×1