字符串中的连续值,获取索引

时间:2017-06-20 01:27:31

标签: python string indexing splice

以下是长度约为+1000的python字符串。

string1 = "XXXXXXXXXXXXXXXXXXXXXAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBB........AAAAXXXXX"
len(string1)  ## 1311

我想知道连续X的结尾和非X字符的开始位置的索引。从左到右读取该字符串,第一个非X字符位于索引位置22,右侧的第一个非X字符位于索引位置1306.

如何找到这些指数?

我的猜测是:

for x in string1:
    if x != "X":
        print(string.index(x))

这个问题是它输出的所有索引都不是X.它没有给出连续X结束的索引。

对我来说更令人困惑的是如何“检查”连续的X.假设我有这个字符串:

string2 = "XXXXAAXAAAAAAAAAAAAAAABBBBBBBBBBBBBB........AAAAXXXXX"

这里,连续的X在索引4结束,而不是索引7.我怎么能检查前面的几个字符是否真的不再连续?

5 个答案:

答案 0 :(得分:2)

使用正则表达式,拆分第一个&最后一组X,得到他们的长度来构建指数。

import re

mystr = 'XXXXAAXAAAAAAAAAAAAAAABBBBBBBBBBBBBB........AAAAXXXXX'
xs = re.split('[A-W|Y-Z]+', mystr)
indices = (len(xs[0]), len(mystr) - len(xs[-1]) - 1)
# (4, 47)
  

我只需要索引的输出。我接着将它们放在randint(first_index, second_index)

可以将索引传递给像这样的函数

randint(*indices)

但是,我怀疑你想使用randint(first_index, last_index)的输出从中间选择一个随机字符,这将是一个较短的选择。

from random import choice
randchar = choice(mystr.strip('X'))

答案 1 :(得分:1)

如果序列只是在字符串的开头和结尾处,那么简单的循环/反向循环就足够了:

string1 = "XXXXXXXXXXXXXXXXXXXXXAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBB........AAAAXXXXX"

left_index = 0
for char in string1:
    left_index += 1
    if char != "X":
         break

right_index = len(string1)
for char in reversed(string1):
    if char != "X":
         break
    right_index -= 1

print(left_index)  # 22
print(right_index)  # 65

答案 2 :(得分:1)

如果我理解你的问题,你就是这样做:

def getIndexs(string):
  lst =[]
  flag = False
  for i, char in enumerate(string):

    if char == "x":
      flag = True

    if ((char != "x") and flag):
      lst.append(i-1)
      flag = False


  return lst


print(getIndexs("xxxxbbbxxxxaaaxxxbb"))
  

[3,10,16]

答案 3 :(得分:1)

正则表达式可以lookahead并识别与模式不匹配的字符:

>>>[match.span() for match in re.finditer(r'X{2,}((?=[^X])|$)', string2)] [(0, 4), (48, 53)]

打破这个局面:

  • X - 我们匹配的角色
  • {2,} - 需要至少连续两次考虑匹配
  • ((?= [^ X])| $ ) - 两个条件将满足匹配
    • (?= [^ X]) - 预测任何 X
    • $ - 字符串的结尾

结果,finditer返回有多个X的每个实例,后跟非X或行尾。 match.span()从字符串中的每个匹配中提取位置信息。

答案 4 :(得分:1)

这将为您提供第一个索引和最后一个索引(非'X'字符)。

s = 'XXABCDXXXEFGHXXXXX'

first_index = len(s) - len(s.lstrip('X'))
last_index = len(s.rstrip('X')) - len(s) - 1

print first_index,last_index

  
    

2 -6

  

工作原理:

对于first_index:

我们在字符串的开头删除所有'X'字符。找到原始字符串和缩短字符串之间的长度差异,可以得到第一个非'X'字符的索引。

对于last_index:

同样,我们在字符串末尾删除'X'字符。我们还从差异中减去1,因为Python中的反向索引从-1开始。

注意:

如果你只是想随机选择first_index和last_index之间的一个字符,你可以这样做:

import random
shortened_s = s.strip('X')
random.choice(shortened_s)