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

Consecutive values in strings, getting indices

下面是一个python字符串,长度约为+1000。

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 结束的索引。

更让我困惑的是如何 "check" 连续的 X。假设我有这个字符串:

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

在这里,连续的X在索引4处结束,而不是索引7。我如何检查前面的几个字符是否真的不再连续?

如果序列如您所说,仅在字符串的开头和结尾,则一个简单的循环/反向循环就足够了:

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

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

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]

使用正则表达式,拆分第一组和最后一组 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)

I simply need the outputs for the indices. I'm then going to put them in randint(first_index, second_index)

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

randint(*indices)

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

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

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

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

分解:

  • X - 我们正在匹配的字符
  • {2,} - 需要至少连续看到两个才能考虑匹配
  • ((?=[^X])|$) - 两个条件都会满足匹配
    • (?=[^X]) - 向前看 X
    • $ - 字符串结尾

因此,finditer returns 每个实例都有多个 X,后跟一个非 X 或行尾。 match.span() 从字符串中提取每个匹配项的位置信息。

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

s = 'XXABCDXXXEFGHXXXXX'

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

打印first_index、last_index

2 -6

工作原理:

对于first_index:

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

对于last_index:

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

注:

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

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