【问题标题】:String slicing in pythonpython中的字符串切片
【发布时间】:2011-07-08 11:41:18
【问题描述】:

我想从最后切单词。假设,我有一些区分大小写的行(大写/小写)

Abc Defg Hijk Lmn
Xyz Lmn jkf gkjhg

我想像下面这样对它们进行切片:

Abc Defg Hijk
Abc Defg
Abc 

然后我需要在变量中获取每个切片行,以便我可以使用它们在某些文本文件中搜索并返回整个文本:

假设我有文本:

 Akggf Abc Defg Hijk fgff jfkjgk djkfkgf     
 Akgff Abc fgff jfkjgk djkfkgf     
 Akggef Abc Defg  fgff jfkjgk djkfkgf
 gjshgs gskk Xyz Lmn jkf
 fgsgdf fkgksk Xyz Lmn

请有任何建议。谢谢!

【问题讨论】:

  • 所以这些选择是该行的前 3、2 和 1 个单词?
  • @Dan D.:是的。但我需要在全局范围内执行此过程并将每条切片线放入变量中。

标签: python substring slice


【解决方案1】:

使用rsplit函数:

>>> s = 'Abc Defg Hijk Lmn'
>>> s.rsplit(' ', 1)[0]
'Abc Defg Hijk'
>>> s = s.rsplit(' ', 1)[0]
>>> s.rsplit(' ', 1)[0]
'Abc Defg'

等等……

另一种变体:

>>> words = s.split()
>>> [' '.join(words[:i]) for i in range(len(words), 0, -1)]
['Abc Defg Hijk Lmn', 'Abc Defg Hijk', 'Abc Defg', 'Abc']

【讨论】:

  • [' '.join(words[:i]) for i in range(len(words), 0, -1)] 喜欢!非常感谢。
【解决方案2】:

您也可以使用以下代码:

dataStr = 'Abc Defg Hijk Lmn'
for word in reversed(dataStr.split()):
    # do something with word

或者:

dataStr = 'Abc Defg Hijk Lmn'
removeLastWord = lambda line: ' '.join([word for word in line.split()[:-1]])
dataStr = removeLastWord(dataStr)
>>> 'Abc Defg Hijk'
dataStr = removeLastWord(dataStr)
>>> 'Abc Defg'
dataStr = removeLastWord(dataStr)
>>> 'Abc'

我已阅读您的更新,并认为 Roman 的解决方案满足您的需求。您可以通过以下方式更新您的代码:

searchTxt = """Abc Defg Hijk Lmn
Xyz Lmn jkf gkjhg"""

data = """kggf **Abc Defg Hijk** fgff jfkjgk djkfkgf
 Akggf **Abc ** fgff jfkjgk djkfkgf
 Akggf **Abc Defg  fgff jfkjgk djkfkgf
 gjshgs gskk **Xyz Lmn jkf**
 fgsgdf fkgksk **Xyz Lmn**"""

searchWords = []
for line in (line for line in searchTxt.split('\n') if line.strip()):
    words = line.split()
    searchWords.extend([' '.join(words[:i]) for i in xrange(len(words), 0, -1)])

searchWords = sorted(searchWords, key=len, reverse=True)# to look first for the longest string match

res = set([line for sword in searchWords for line in data.split('\n') if sword in line])

# OR

res = []
for line in data.split('\n'):
    for sword in searchWords:
        if sword in line:
            res.append(line)
            break

如果您需要获取全文:

resultText = '\n'.join(res)

【讨论】:

  • @Artsiom Rudzenka:能否请您详细说明一下。我的意思是如何为许多 dataStr 获得所需的切片线。谢谢!
  • 举个例子,我可以帮你。
  • @Artsiom Rudzenka:我已经更新了问题。请你看看!
  • 请您看一下这部分searchWords.extend([' '.join(words[:i]) for i in xrange(len(words), 0, -1)])
  • 这有什么问题?我已复制所有代码并重新运行它 - 一切正常
【解决方案3】:

从字符串创建列表:

a="Abc Defg Hijk Lmn".split()

看看:

['Abc', 'Defg', 'Hijk', 'Lmn']

切片,删除最后一个条目:

a[:-1]

这给出了:

['Abc', 'Defg', 'Hijk']

再次将其加入字符串:

" ".join(a[:-1])

给予:

'Abc Defg Hijk'

现在,循环重复一遍......

【讨论】:

  • 请注意s != " ".join(s.split())s == " ".join(s.split(" "))s = "Two spaces"
猜你喜欢
  • 2014-07-21
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
  • 2013-10-29
  • 2020-11-27
  • 2021-05-01
相关资源
最近更新 更多