以下是长度约为+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.我怎么能检查前面的几个字符是否真的不再连续?
答案 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])|
$ )
- 两个条件将满足匹配
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
我们在字符串的开头删除所有'X'字符。找到原始字符串和缩短字符串之间的长度差异,可以得到第一个非'X'字符的索引。
同样,我们在字符串末尾删除'X'字符。我们还从差异中减去1,因为Python中的反向索引从-1开始。
如果你只是想随机选择first_index和last_index之间的一个字符,你可以这样做:
import random
shortened_s = s.strip('X')
random.choice(shortened_s)